난이도: Lv. 2
정답률: 50%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/12899
알고리즘
기본적으로는 3진수를 구하는 방법으로 푼다.
이 문제에서 중요한 점은 0이다. 10진수를 3진수로 바꾸면 0이 생긴다.
0을 1로, 1을 2로, 2를 4로 바꾸면 해결될 문제 같지만 10진수 2를 124 나라의 숫자로 변환해 본다고 해보자.
10진수에서 2는 02와 동일하다. 하지만 2를 124 나라의 숫자로 바꾸면 2이고, 02를 124 나라의 숫자로 바꾸면 12가 된다.
따라서
- n을 3진수로 바꿀 때 루프마다 1씩 빼고 3으로 나눈 나머지를 구한다.
- 1.에서 계산한 나머지가 0이면 1로, 1이면 2로, 2면 4로 바꿔 배열에 저장한다.
- 배열에 저장된 나머지들을 역순으로 이어주면 정답이 된다.
코드
function solution(n) {
var answer = '';
const expressNum = [1, 2, 4];
const numArr = [];
while (n > 0) {
n--;
numArr.push(expressNum[n % 3]);
n = Math.floor(n / 3);
}
for (let i = numArr.length - 1; i >= 0; i--) {
answer += numArr[i];
}
return answer;
}
주저리
진짜 오랜만에 빨리 푼 문제다. 근데 1을 왜 빼고 나머지 연산을 해야 하는지 설명을 못하겠다. 그냥 그렇게 푸니까 정답이었다(?) 루프 한 번에 하나의 자리를 계산하는 건데 각 자리에는 0이 들어갈 수 없으므로 0을 제외한다는 뜻으로 1을 빼는 것 같기는 하다.
'코딩테스트' 카테고리의 다른 글
[JS] 메뉴 리뉴얼 (1) | 2024.04.16 |
---|---|
[JS] 전력망을 둘로 나누기 (0) | 2024.04.09 |
[JS] 유전법칙 (0) | 2024.04.04 |
[JS] 연속된 부분 수열의 합 (0) | 2024.04.02 |
[JS] 큰 수 만들기 (0) | 2024.03.27 |