Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 배열 속 혼동 숫자(Confusing Number) 찾는 방법

혼동 숫자(Confusing Number)란?

배열 속 어떤 숫자를 수직·수평으로 180도 회전했을 때, 그 결과가 배열에 존재하는 다른 숫자가 된다면 이를 '혼동 숫자(confusing number)'라고 합니다. 예를 들어, 6을 180도 회전하면 9가 되고, 반대로 9를 회전하면 6이 됩니다.

단, 180도 회전 후에도 유효한 숫자가 되는 것은 0, 1, 6, 8, 9뿐이라는 점에 유의해야 합니다. 2, 3, 4, 5, 7은 회전하면 올바른 숫자가 되지 않으므로 혼동 숫자가 될 수 없습니다.

문제 정의

자연수 num을 첫 번째이자 유일한 인수로 받는 자바스크립트 함수를 작성해야 합니다. 함수는 먼저 1부터 num까지(num 포함)의 모든 자연수로 배열을 구성합니다.

예를 들어 num = 5라면 배열은 다음과 같습니다.

[1, 2, 3, 4, 5]

그다음 이 배열 안에 혼동 숫자가 몇 개 있는지 세어 그 개수를 반환해야 합니다.

예시

입력이 다음과 같다면,

const num = 10;

출력은 다음과 같아야 합니다.

const output = 5;

배열이 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]이고, 그중 혼동 숫자는 다음과 같기 때문입니다.

1, 6, 8, 9, 10
  • 1 → 회전하면 1 (배열에 존재)
  • 6 → 회전하면 9 (배열에 존재)
  • 8 → 회전하면 8 (배열에 존재)
  • 9 → 회전하면 6 (배열에 존재)
  • 10 → 회전하면 01, 즉 1 (배열에 존재)

구현 코드

이 문제를 해결하는 코드는 다음과 같습니다.

const num = 10;
const countConfusing = (num = 1) => {
    let count = 0;
    const valid = '01689';
    const rotateMap = {'0': '0', '1': '1', '6': '9', '8': '8', '9': '6'};
    const prepareRotation = num => {
        let res = '';
        const numArr = String(num).split('');
        if(numArr.some(el => !valid.includes(el))){
            return false;
        };
        numArr.map(el => {
            res = rotateMap[el] + res;
        });
        return +res;
    };
    for(let i = 1; i <= num; i++){
        const rotated = prepareRotation(i);
        if(rotated && rotated > 0 && rotated <= num){
            count++;
        };
    };
    return count;
};
console.log(countConfusing(num));

코드 동작 원리

  1. 회전 가능 여부 확인: 문자열 '01689'를 기준으로, 숫자의 모든 자릿수가 회전 가능한 숫자인지 검사합니다. 하나라도 포함되지 않으면 false를 반환합니다.
  2. 회전 변환: rotateMap 객체를 이용해 각 자릿수를 회전된 값으로 매핑하면서, 뒤집힌 위치에 맞게 앞쪽에 덧붙여 최종 회전 결과를 만듭니다.
  3. 개수 세기: 1부터 num까지 반복하면서 각 숫자를 회전해 보고, 결과가 유효한 숫자이며 num 범위 안에 있다면 카운트를 증가시킵니다.

출력 결과

콘솔에 출력되는 결과는 다음과 같습니다.

5

이처럼 간단한 문자열 처리와 매핑 기법만으로도 배열 내 혼동 숫자를 효율적으로 찾을 수 있습니다.