프로그래머스
n진법 수 A를 m진법 수 B로 바꾸려면, A를 m으로 반복해서 나눈 나머지들과 몫을 활용하면 된다.
예를 들어, 10진법 수 45를 3진법으로 표현해보자. 45를 3으로 나누었을때 몫은 15, 나머지는 0이다. 이어서 3으로 또 나누었을때 몫은 5, 나머지는 0이다. 몫이 3보다 작아질때까지 이 과정을 반복한 후 마지막 몫부터 나머지를 일렬로 이어쓰면 된다.
function solution(n){
//10진법 수를 3진법으로 만드는 과정
let ternary = "";
while(n>=3){
ternary += n%3;
n=Math.floor(n/3);
}
ternary += n;
//3진법 수를 10진법으로 만드는 과정
let length = ternary.length;
let res = 0;
for(let i=0;i<ternary.length;i++){
res += Number(ternary[i])*Math.pow(3,length-1);
length--;
}
return res;
split
메소드로 문자열을 배열에 저장한다. reverse
메소드로 배열의 순서를 뒤집는다.join
메소드로 배열의 요소를 하나의 문자열로 합친다.parseInt
메소드로 문자열을 n진법 숫자로 만들어 리턴한다.function solution(n){
var answer = 0;
answer = parseInt(n.toString(3).split("").reverse().join(""),3);
}
Number.prototype.toString([radix])
- 숫자를 n진법으로 바꾼후 문자열로 만든다.
- 만약 toString()에 2와 36 사잇값이 아닌 radix(기수)가 주어지면,
RangeError
가 발생한다.
parseInt(string, radix)
- string
분석할 값으로 string이 문자열이 아니라면 문자열로 변환한다. 문자열의 선행 공백은 무시한다.- radix
optional
string이 표현하는 정수를 나타내는 2와 36 사이의 진수. radix가 2보다 작거나 36보다 큰 경우 NaN을 반환한다.
지금까지 toString과 parseInt 메소드를 사용했지만 인자를 넣을 수 있다는 사실을 몰랐는데, 인자를 넣어 n진법 숫자로 만들 수 있다는 것을 알게되었다.
Math.floor와 parseInt의 기능의 차이도 생각해볼 수 있었다.