리코딩 : 알고리즘

7. 프로그래머스 - 124나라의 숫자

BreezeBm 2021. 9. 23. 09:10

1. 문제

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법 124 나라 10 진법 124나라
1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

입출력 예

n result
1 1
2 2
3 4
4 11

2. 나의 풀이

function solution(n) {
    let answer = '';
    const numArr = [4, 1 ,2];
    while(n) {
        // 나머지로 나오는 값을 배열의 인덱스로 사용
        answer = numArr[n % 3] + answer
        if(n % 3 == 0) {
            n = (n / 3) - 1;
        } else {
            n = Math.floor(n / 3)
        }
    }
    return answer;
}

- 1, 2, 4 이 3가지의 숫자로 10진법 숫자를 표현하는 나라다.
- 3을 기준으로 10진법 수를 나눠서 나머지를 [4, 1, 2] 배열의 index로 사용한다.
- 10진법 숫자 1을 기준으로 하면 1을 3으로 나누면 몫은 0 나머지는 1이다.
- 이 때, [4, 1, 2] 배열의 1번 인덱스의 값은 1이기 때문에 124나라에서는 1로 표현한다.
- 10진법 숫자 8을 기준으로 하면 8을 3으로 나누면 몫은 2 나머지는 2이다.
- 이 때, [4, 1, 2] 배열의 2번 인덱스의 값은 2이다. 아직 몫이 2가 남아있기 때문에 3으로 
- 한번 더 나누어 주면, 마찬가지로 나머지가 2고, 배열의 2번 인덱스의 값은 2다.
- 즉, 124나라에서 숫자 8은 22로 표현된다.
    
- 문제는 3으로 딱 나누어 떨어질 때 이다.
- 10진법 숫자 9를 3으로 나누면, 몫이 3 나머지가 0이다.
- [4, 1, 2] 배열에서 0번째 인덱스는 4이다. 아직 나누기가 다 진행되지 않았다. 
- 몫인 3을 나누면 나머지가 또 0이 되고 배열에서는 4다. 그렇게 되면 9는 124나라에서
- 44로 표현이 되야 하지만, 24로 표현이된다.
    
- 3으로 떨어지는 숫자의 경우에는 몫을 - 1을 해주어야 한다. 그렇게 되면 
- 9라는 숫자를 3으로 나누면 몫은 3 나머지가 0 (배열에서 4를 획득)

- 몫에서 1을 빼면 2가 되고, 2를 3으로 나누면 나머지가 2 (배열에서 2를 획득)
- 9은 24라는 값으로 나오게 된다.

 

규칙을 찾으면 문제를 풀 수 있었다. 오랜만에 노트를 꺼내서, 어릴 때 배운 나눗셈을 떠..올...

다른 분들의 풀이를 보게 되니, if문으로 n값을 바꿔주는 것을 간결히 작성하신 것을 발견했다. 지난 번 풀이 때도, 이와 비슷한 풀이가 있었는데, 바로 적용하기는 쉽지 않은 것 같다! 다음에는 해봐야지!

 n = (n % 3 === 0) ? (n / 3 - 1) : Math.floor(n / 3)

공부.. 공부