프로그래머스 LV2 #3 124 나라의 숫자

Jake Seo·2020년 7월 21일
0

프로그래머스 LV2

목록 보기
3/10

프로그래머스 LV2 #3 124 나라의 숫자

문제

풀이

124 나라의 숫자 문제는 3진법을 구현하는 것과 매우 닮아있습니다. 그래서 저는 n을 3진법으로 바꾸는 코드를 먼저 구현한 후에 124나라의 숫자로 변형시켰습니다.

3진법과 하나 다른 점이 있다면, 3진법에서는 3/10, 9/100등 n이 3배수일 때, 자릿수가 하나 늘어나고 뒤에 0이 들어옵니다. 그런데, 124 나라의 숫자 문제에서는 n=3일 때 4라는 문자가 들어오게 됩니다.

124나라의 숫자와 3진법의 차이는 0이 있고 없고로 볼 수 있습니다.

결과적으로 제가 푼 방식을 설명드리면

  1. 3진법을 구현한다.
  2. n이 3의 배수일 때, n-1을 한 후에 기존에 붙일 숫자 대신4를 붙여준다.
    • 124나라에는 0이 없으므로, 기존에 3진법에서는 0으로 표현되어야 하는 케이스에 예외처리를 해주는 것입니다.

간단하게 생각해보면,

10진수 9일때, 100(3진법) -> 24(124나라)와 같은 케이스를 일반화하면 되는데, 이 경우 100(3진법)-1 = 22(3진법)가 되고, 여기서 끝의 2대신에 4를 넣으면 24(124나라)가 완성됩니다.

이러한 방법을 일반화하면 다음과 같은 소스코드로 표현됩니다.

let solution = n => {
    let answer = [];

    while(n !== 0){
        let remainder = n % 3;
        
        n = (n - remainder) / 3;
        
        if(remainder === 0){
            n = n - 1;
            remainder = 4;
        }

        answer.push(remainder);
    }
    
    return answer.reverse().join("");
};

풀이엔 쉽게 적었지만 처음에 직관적으로 이해가 잘 되지 않아서 고생 좀 했습니다.

일반화 방법을 빠르게 파악하려면 숫자와 친숙해야 할 것 같습니다.

다른 풀이

let solution = (n) => n === 0 ? '' : solution(parseInt((n - 1) / 3)) + [1, 2, 4][(n - 1) % 3];

다른 분의 풀이를 기준으로 만든 코드인데, 매우 똑똑하게 코딩하신 것 같습니다.

10을 예로 들면,

먼저,

  1. solutionparseInt((10 - 1) / 3)의 값인 3이 들어갑니다.
  2. solutionparseInt((3 - 1) / 3)의 값인 0이 들어갑니다.
  3. 0solution으로 들어왔으므로 처음에는 ''를 리턴하게 됩니다.
  4. (3 - 1) % 32이며, [1, 2, 4]의 배열에서 4를 가져오게 됩니다.
  5. (10 - 1) % 30이며, [1, 2, 4]의 배열에서 1을 가져오게 됩니다.
  6. 결과는 41이 나오게 됩니다.

이는 3진수를 구할 때, n = n / 3을 반복적으로 함을 이용한 방법입니다. 단, 124나라에서는 0이 존재하지 않고, 3진수와 달리 해당 위치의 3의 제곱의 숫자가 1, 2, 3으로 대체되는 것처럼 1 많이 표현될 수 있으므로, 계속하여 n - 1을 하는 형식으로 코딩되어있습니다.

profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.

0개의 댓글