728x90
문제 설명
자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
입출력 예
n result
45 | 7 |
125 | 229 |
입출력 예 #1
- 답을 도출하는 과정은 다음과 같습니다.
n (10진법) n (3진법) 앞뒤 반전(3진법) 10진법으로 표현
45 | 1200 | 0021 | 7 |
- 따라서 7을 return 해야 합니다.
< 나의 풀이 >
function solution(n) {
let arr=[]
while(n>0){
arr.push(n%3)
n=parseInt(n/3)
}
return arr.reverse().map((v,i)=>v*(3**i)).reduce((a,b)=>a+b,0)
}
나의 풀이 전략
- 10진법 → 3진법을 구하려면 0이 될때까지 계속 3으로 나누고 그 몫을 1의 자리부터 쓰면 된다
- while문을 사용해 n이 0보다 클 동안 3으로 나눠주고 나머지를 arr배열에 push하면 3진법으로 바꾼것의 앞뒤 반전한 결과가 나온다 ( push 는 배열 뒤에 계속 쌓이기 때문 )
- 지금 이미 arr에는 앞뒤 반전한 결과가 있기 때문에 배열을 반전해주는 reverse() 메소드를 사용해 다시 반전한 후 (3진법으로만 변환한 결과로 바꾼 후) map() 메소드를 이용하여 arr의 첫 인덱스부터 (3**0)*a + (3**1)*b + … 해준다.
- reduce() 메소드를 이용하여 배열의 각 값을 더해주면 10진법으로 변환한 결과 완성
< 다른 사람의 풀이 >
function solution(n) {
n = n.toString(3).split('').reverse().join('')
return parseInt(n, 3)
}
10진수.toString(n) 하면 n진수로 변환이 되는구나..? 심지어 시간도 조금 더 적게 걸린다
toString() 이용해서 3진법으로 변환 후 split(””)해서 배열로 바꾼 다음 reverse() 로 뒤집고 join(””)이용해 문자열로 변경 → parseInt() 로 3진법 숫자로 된 문자열을 10진법으로 다시 변경
멋있다🥹!!
10진수를 다른 진수로 변환하기 위해서는 toString()을,
다른 진수를 10진수로 변환하기 위해서는 parseInt()를 쓴다고 한다
toString() 사용 진수 변환
let intNum = 3;
console.log(intNum.toString(2)); //11
//11은 eleven이 아니고 이진수의 00011임.
intNum = 32;
console.log(intNum.toString(16)); //20
//20은 twenty가 아니고 16진수의 00020임(2*16).
parseInt() 사용 진수 변환
//3진수 -> 10진수
let trinary = "2122"
console.log(parseInt(number,3));
//N진수 -> 10진수
let parameter = "~"
parseInt(parameter,N);
728x90