자릿수를 먼저 구하고,
(자릿수가 3+9+27 ... 이럴 때 증가하므로 3(1+2+ ...+n) 값보다 커지는 시점의 자릿수가 n뭐시기이다 이런 식으로 접근했다)
해당 자릿수에 대해서 재귀를 돌려고 해봤으나 당연히 실패했다. 재귀로 하나하나 찾는 게 아니라 규칙을 찾아야 할 것 같다.
function solution(n) {
let answer = '';
if (n === 1) return '1';
if (n === 2) return '2';
if (n === 3) return '4';
const sr = [1, 2, 4];
let digit = 1;
let scope = 0;
let prevScope = 0;
// let scopeArr = [];
while (1) {
prevScope = scope;
if (digit%2==1) {
scope += 3*((digit+2)*((digit+1)/2) - (digit+1));
} else {
scope += 3*((digit+1)*((digit)/2));
}
// scopeArr.push(scope);
if (scope < n) digit++;
else {
break;
}
}
// let cnt = n - scopeArr[digit-2];
let cnt = n - prevScope;
let arr = Array.from({length:digit});
function dfs(L) {
if (L>digit) return;
if (cnt<0) return;
if (L===digit) cnt -= 1;
if (L===digit && cnt===0) {
answer = arr.join('');
return;
}
else {
for (let i=0; i<3; i++) {
arr[L]=sr[i];
dfs(L+1);
arr.pop();
}
}
}
dfs(0)
return answer;
}
// console.log(solution(1));
// console.log(solution(2));
// console.log(solution(3));
// console.log(solution(4)); // "11";
console.log(solution(14));
3진법에서 규칙을 찾아야 한다는 생각을 너무 쉽게 포기해버렸다.
[프로그래머스] 124 나라의 숫자 / JavaScript
array.reverse() 대신 문자열에 더해줄 때부터 거꾸로 더해준다.
function solution(n) {
let answer = '';
const numArr = [4, 1, 2];
while(n) {
answer = numArr[n%3] + answer;
// 0 == false
n = n%3 === 0 ? n/3 -1 : Math.floor(n/3);
}
return answer;
}