📑 문제


✏️ 풀이
재영
const get124CountryNumber = (n, res = [], num = [4, 1, 2]) => { if (!n) return res; res = (n % 3 === 0) ? [...get124CountryNumber(parseInt((n - 1) / 3), res), num[n % 3]] // 3으로 나눠질 때 나머지가 0이 되는 것들. : [...get124CountryNumber(parseInt(n / 3), res), num[n % 3]] return res.join(''); } const solution = n => { return get124CountryNumber(n) } const n = 24; console.log(solution(n))
풀이를 쓰자면!
- 재귀를 돌립니다. 이때
res
라는array
에 각 자리 숫자들을 담아보겠음다.
- 3진수의 형식으로 돌리는데 가장 중요한 건 여기서 3의 배수가 되는 순간 예외가 생겨버림다. (원래였으면 1 2 10 이 되어야 하지만 1 2 4 가 되는 현상 발생)
- 따라서 이에 대한 예외 처리를 해주면서 계속 돌려유!.
- 결과적으로 나온 배열을
join
시켜줘유!.
효성
첫 번째 풀이 - 실패
function solution(n) { let answer =''; let cnt = parseInt(n/3); let i = 0; while(i <= cnt) { if(n%3 === 0) { i++ answer += 4; } else if (n%3 === 1) { answer += 1; } else { answer += 2; } i++; } //console.log(answer) return answer; }
- 재귀적으로 숫자가 호출된다는 것까진 파악함.
- 규칙이 보이긴하는데 코드로 어떻게 표현해야 할지 모르겠음.
참고한 풀이
function solution(n) { let answer =''; var array1_2_4 = new Array(4, 1, 2); while(n) { answer = array1_2_4[n % 3] + answer; n = Math.floor((n - 1) / 3); } return answer; }
n-1하면 되는데 어떻게 사고 하면 되는 걸까요?
function change124(n) { return n === 0 ? '' : change124(parseInt((n - 1) / 3)) + [1, 2, 4][(n - 1) % 3]; }
은찬
function solution(n) { let answer = ''; const number = [4, 1, 2]; while(n){ const remain = Math.floor(n % 3); n = Math.floor(n / 3); if(remain === 0){ n--; } answer = number[remain].toString() + answer; } return answer; }
10진수를 3진법으로 바꾸는 방법을 통해 풀었습니다.
주어진 n을 3으로 나누기 때문에 나머지는 0, 1, 2가 나옵니다.
만약 3으로 나눈 결과의 나머지가 0이라면, 4로 나타낼 수 있습니다.
또한, 나머지가 1, 2이라면 각각 1과 2로 나타낼 수 있습니다.
0→4, 1→1, 2→2 라는 규칙이 나오기 때문에 배열로 이를 표현할 수 있습니다.
while문을 통해 n이 0보다 클 때까지 반복합니다.
n을 3으로 나눈 나머지를 remain에 저장하고, n 또한 3으로 나눴을 때 몫으로 바꿔줍니다.
만약 remain이 0이라면 알맞게 떨어졌다는 뜻이므로 n—를 해줍니다.
answer는 문자열이기 때문에 number[remain]에 해당하는 수를 문자열로 바꾸고, 갱신해주면 됩니다.