우선 규칙성을 파악하기 위해 1부터 24까지 나열해보았다
10진법 | 124 나라 | 10진법 | 124 나라 |
---|---|---|---|
1 | 1 | 13 | 111 |
2 | 2 | 14 | 112 |
3 | 4 | 15 | 114 |
4 | 11 | 16 | 121 |
5 | 12 | 17 | 122 |
6 | 14 | 18 | 124 |
7 | 21 | 19 | 141 |
8 | 22 | 20 | 142 |
9 | 24 | 21 | 144 |
10 | 41 | 22 | 211 |
11 | 42 | 23 | 212 |
12 | 44 | 24 | 214 |
일단 처음 3으로 나눴을때 나머지
에 따라 마지막 자릿수의 값이 정해지는 것을 발견하였다.
1이면 1, 2이면 2, 0이면 4
로 첫째자리의 수가 정해진다
이후로는 몫
을 계산하게 되는데,
n값을 3으로 나눈 나머지가 0일때는 n을 3으로 나눈 몫에 -1
를 해주면서 n에 대한 나머지를 이어 계산해야 올바른 124 나라의 문자열로 반환된다
function solution(n) {
var answer = '';
// 나머지에 따른 값을 이어붙이기 위한 배열
let number124 = [4, 1, 2];
// n이 0이 되기 전까지 반복
while (n) {
// 나머지가 0인 경우 예외처리
answer = number124[n % 3] + answer;
n = (n % 3 == 0) ? Math.floor(n / 3) - 1 : Math.floor(n / 3);
}
return answer;
}
시간이 한참 흐르고 다시 풀었는데,
배열 활용과 삼항 연산을 활용하지 않고 switch문을 사용하여 문제를 해결하고, if문을 한번더 사용하였다
function solution(n) {
let result = '';
while(n > 0){
const rest = n % 3;
// switch 문사용
switch(rest){
case 0:
result = 4 + result;
break;
case 1:
result = 1 + result;
break;
case 2:
result = 2+ result;
break;
}
// n 값 저장
n = Math.floor(n/3);
// 나머지가 0인 경우 예외처리
if(rest === 0)
n-=1;
}
return result;
}
가독성이 별로 좋지않은 코드인것 같다
앞으로는 짧고 간결하게 코드를 짜보도록 노력해야 겠다