1. 문제 설명

1부터 nn까지의 숫자 중 좋은 숫자(Good Integer)의 개수를 구하는 문제입니다.

어떤 숫자를 180도 회전시켰을 때:
1. 모든 자릿수가 여전히 유효한 숫자로 바뀌어야 합니다. (3, 4, 7이 포함되면 유효하지 않음)
2. 회전한 결과가 원래 숫자와 다른 값이 되어야 합니다.


2. 조건 분석

숫자별 180도 회전 결과는 다음과 같습니다.

  • 변하지 않는 숫자: 0, 1, 8
  • 다른 숫자로 변하는 숫자: 2 ↔\leftrightarrow 5, 6 ↔\leftrightarrow 9
  • 유효하지 않은 숫자: 3, 4, 7 (포함 시 무조건 탈락)

따라서 좋은 숫자가 되려면:

  • 3, 4, 7을 단 하나도 포함하지 않아야 함
  • 2, 5, 6, 9 중 적어도 하나 이상을 포함하여 회전 후 값이 바뀌어야 함

3. 접근 방법 (Brute Force)

  1. 1부터 n까지 모든 숫자를 순회합니다.
  2. 각 숫자를 문자 배열로 변환한 뒤, 3, 4, 7이 포함되어 있다면 바로 다음 숫자로 넘어갑니다 (continue).
  3. 각 자릿수에 대해 switch 문을 사용하여 180도 회전시킨 새로운 문자 배열을 생성합니다.
  4. 회전된 배열을 다시 숫자로 변환하여 원래 숫자와 비교합니다.
  5. 값이 달라졌다면 좋은 숫자로 판단하고 카운트(valids)를 1 증가시킵니다.

4. 제출 코드 (TypeScript)

function rotatedDigits(n: number): number {
    let valids = 0;

    for (let i = 1; i <= n; i++) {
        const arr = [...String(i)];

        // 3, 4, 7이 하나라도 들어가면 회전 후 올바른 숫자가 되지 않음
        if (arr.includes('3') || arr.includes('4') || arr.includes('7')) continue;

        // 각 자릿수를 180도 회전
        for (let j = 0; j < arr.length; j++) {
            switch (arr[j]) {
                case '2':
                    arr[j] = '5';
                    break;
                case '5':
                    arr[j] = '2';
                    break;
                case '6':
                    arr[j] = '9';
                    break;
                case '9':
                    arr[j] = '6';
                    break;
            }
        }

        const rotated = Number(arr.join(''));

        // 회전된 숫자가 원래 숫자와 다르면 좋은 숫자
        if (i !== rotated) valids++;
    }

    return valids;
};
profile
내 지식을 공유할 수 있는 대담함

0개의 댓글