124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.
예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.
10진법 | 124 나라 |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
5 | 12 |
6 | 14 |
7 | 21 |
8 | 22 |
9 | 24 |
10 | 41 |
자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.
n | result |
---|---|
1 | 1 |
2 | 2 |
3 | 4 |
4 | 11 |
10진법을 3진법으로 변환하는데, 나머지가 0일 때만 계산이 달라진다.
10진법, 3진법, 124 나라 간의 변환이다.
10진법 | 3진법 | 124나라 |
---|---|---|
1 | 1 | 1 |
2 | 2 | 2 |
3 | 10 | 4 |
4 | 11 | 11 |
5 | 12 | 12 |
6 | 20 | 14 |
7 | 21 | 21 |
8 | 22 | 22 |
9 | 100 | 24 |
10 | 101 | 41 |
위 표에서 알 수 있듯이, 나머지가 0일 때를 제외하곤 3진법과 동일하게 변경된다.
나머지가 0으로 나누어질 때, 몫을 -1 하고 나머지는 4가 되면 제대로 값이 나온다.
reverse()
메서드를 사용하여 뒤에서부터 출력해주었다. function solution(n) {
let value = 0;
let reminder = 0;
let answer = [];
while(n > 1) {
value = Math.floor(n / 3);
reminder = n % 3;
answer.push(reminder);
n = Math.floor(n / 3);
}
if(n > 0) answer.push(n);
return answer.reverse().join("");
}
function solution(n) {
let value = 0;
let reminder = 0;
let answer = [];
while(n > 1) {
value = Math.floor(n / 3);
reminder = n % 3;
**if(reminder === 0) {
n -= 1;
reminder = 4;
}**
answer.push(reminder);
n = Math.floor(n / 3);
}
if(n > 0) answer.push(n);
return answer.reverse().join("");
}
function solution(n) {
let answer = [];
let value = 0;
let reminder = 0;
while(n > 1) {
value = Math.floor(n / 3);
reminder = n % 3;
if(reminder === 0) {
n -= 1;
reminder = 4;
}
answer.push(reminder);
n = Math.floor(n / 3);
}
if(n > 0) answer.push(n);
return answer.reverse().join("");
}
function change124(n) {
return n === 0 ? '' : change124(parseInt((n - 1) / 3)) + [1, 2, 4][(n - 1) % 3];
}
재귀를 사용하여 구현하였다.
나는 n이 0보다 클 때 출력을 해주었는데, 여기선 삼항 연산자를 사용하여 0일 때 출력을 안 하는 것으로 하였다.
그리고 n을 3으로 나눌 때, (n - 1)을 해주는 것은 n을 나눈 "몫"은 -1을 해도 같은 값이 나오기 때문이다.
예를 들어 n = 13일 경우, 13 / 3 ⇒ 4
== 12 / 3 ⇒ 4
== 14 / 3 ⇒ 4
동일하다.
마지막으로 몫 뒤에 나머지 값들을 붙여준다.
나머지 값은 [1, 2, 4] 배열에서 (n - 1) % 3의 인덱스에 있는 숫자가 나오게 된다. 여기서 -1을 해주는 이유는 인덱스가 0부터 시작하기 때문이다.
정확성 테스트
테스트 1 〉 통과 (0.05ms, 30.3MB)
테스트 2 〉 통과 (0.05ms, 30.2MB)
테스트 3 〉 통과 (0.06ms, 30.1MB)
테스트 4 〉 통과 (0.07ms, 30.1MB)
테스트 5 〉 통과 (0.06ms, 30.2MB)
테스트 6 〉 통과 (0.06ms, 30.2MB)
테스트 7 〉 통과 (0.08ms, 30.2MB)
테스트 8 〉 통과 (0.05ms, 30.3MB)
테스트 9 〉 통과 (0.06ms, 29.8MB)
테스트 10 〉 통과 (0.08ms, 30.2MB)
테스트 11 〉 통과 (0.14ms, 30.2MB)
테스트 12 〉 통과 (0.06ms, 29.9MB)
테스트 13 〉 통과 (0.06ms, 30.2MB)
테스트 14 〉 통과 (0.10ms, 30.1MB)
효율성 테스트
테스트 1 〉 통과 (0.08ms, 30.1MB)
테스트 2 〉 통과 (0.08ms, 30.2MB)
테스트 3 〉 통과 (0.06ms, 30.1MB)
테스트 4 〉 통과 (0.09ms, 30.2MB)
테스트 5 〉 통과 (0.09ms, 29.9MB)
테스트 6 〉 통과 (0.09ms, 30.1MB)
- 정확성 : 70.0
- 효율성 : 30.0
- 합계 : 100.0 / 100.0