프로그래머스 LV2 #3 124 나라의 숫자
124 나라의 숫자 문제는 3진법을 구현하는 것과 매우 닮아있습니다. 그래서 저는 n을 3진법으로 바꾸는 코드를 먼저 구현한 후에 124나라의 숫자로 변형시켰습니다.
3진법과 하나 다른 점이 있다면, 3진법에서는 3/10
, 9/100
등 n이 3배수일 때, 자릿수가 하나 늘어나고 뒤에 0이 들어옵니다. 그런데, 124 나라의 숫자 문제에서는 n=3
일 때 4
라는 문자가 들어오게 됩니다.
124나라의 숫자와 3진법의 차이는 0
이 있고 없고로 볼 수 있습니다.
결과적으로 제가 푼 방식을 설명드리면
4
를 붙여준다.간단하게 생각해보면,
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을 예로 들면,
먼저,
solution
에 parseInt((10 - 1) / 3)
의 값인 3
이 들어갑니다.solution
에 parseInt((3 - 1) / 3)
의 값인 0
이 들어갑니다.0
이 solution
으로 들어왔으므로 처음에는 ''
를 리턴하게 됩니다.(3 - 1) % 3
은 2
이며, [1, 2, 4]
의 배열에서 4
를 가져오게 됩니다. (10 - 1) % 3
은 0
이며, [1, 2, 4]
의 배열에서 1
을 가져오게 됩니다. 41
이 나오게 됩니다.이는 3진수를 구할 때, n = n / 3
을 반복적으로 함을 이용한 방법입니다. 단, 124나라에서는 0
이 존재하지 않고, 3진수와 달리 해당 위치의 3의 제곱의 숫자가 1
, 2
, 3
으로 대체되는 것처럼 1 많이 표현될 수 있으므로, 계속하여 n - 1
을 하는 형식으로 코딩되어있습니다.