자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
n은 1 이상 100,000,000 이하인 자연수입니다.
n | result |
---|---|
45 | 7 |
125 | 229 |
입출력 예 #1
답을 도출하는 과정은 다음과 같습니다.
n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
---|---|---|---|
45 | 1200 | 0021 | 7 |
따라서 7을 return 해야 합니다.
입출력 예 #2
답을 도출하는 과정은 다음과 같습니다.
n (10진법) | n (3진법) | 앞뒤 반전(3진법) | 10진법으로 표현 |
---|---|---|---|
125 | 11122 | 22111 | 229 |
따라서 229를 return 해야 합니다.
function solution(n) {
return parseInt(`${n.toString(3)}`.split('').reverse().join(''), 3)
}
원래 toString()
은 값을 문자열로 바꿔주는 함수인데, 기수(radix)를 매개변수로 받아 다른 진수로 변환해줄 수 있다. toString(3)은 3진법으로 바꿔달라는 이야기이다. 3진법으로 바꾼 후, split('')
으로 문자 배열로 만들어준 다음 뒤집어서 합쳤다.
이후 parseInt()
함수 안에 넣어 줬다. 아까 한 것처럼 toString()
에다가 넣으면 현재 함수를 10진법으로 바꿔달라는 이야기이므로 값이 다시 10진법으로 변환되지 않는다. 그래서 toString()
의 인수가 변환될 진수라면 parseInt()
의 인수는 현재 문자열의 진수이다. 그래서 parseInt(문자열, 3)은 현재 문자열이 3진수라는 의미이고, 이 3진수를 10진수로 바꿔 준다.
const solution = (n) => {
return parseInt([...n.toString(3)].reverse().join(""), 3);
}
전반적으로 내가 푼 방식과 유사하긴 하지만, spread operator(전개 연산자)를 사용해 줬다. [...n.toString(3)] 이렇게 써 주면, 숫자를 3진법 문자로 만들어 준 뒤 문자 하나씩 분리하여 배열에 넣어 준다.
특징적인 점은 숫자 1200는 전개연산자가 나누지 못하지만, 1200이라는 문자는["1","2","0","0"] 이런 식으로 나눠서 배열에 들어가게 된다.
function solution(n) {
const answer = [];
while(n !== 0) {
answer.unshift(n % 3);
n = Math.floor(n/3);
}
//3으로 나눈 나머지를 맨 앞으로 보내주고, 몫은 다시 while문에서 돌면서 몫을 내림한 수가 0이 아닐 때까지 반복해준다.
return answer.reduce((acc,v,i) => acc + (v * Math.pow(3, i)),0);
}//3의 i제곱을 더해서 돌려준다.
숫자로 푸는 방법이다. Math.pow()
는 제곱을 구하는 함수이다. Math.pow(3, 2)라면 3의 제곱인 9를 출력해 준다.