본문 바로가기
Algorithm🐙/BaekJoon

[백준] 11005번: 진법 변화2 -JS

by ZZiwon Choi 2024. 7. 7.

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다

예제 입력

60466175 36

예제 출력

ZZZZZ

 

진법에대한 이해가 부족해서 더 어려웠던 문제.... 진법 변환은 다른 분들의 풀이를 참고했다. 

이해하기 쉬웠던 방법은 입력받은 10진법 수를 B진법 수로 계속해서 나눴을때 나온 각각의 나머지를 나열하는 것이다.

 

let fs=require('fs');
let [a,b]=fs.readFileSync('/dev/stdin').toString().split(' ');
let result=[];
a=Number(a);
b=Number(b);

while(a>=b){
    let reminder=a%b;
    let quotient=Math.trunc(a/b);
    if(reminder>=10){
        result.push(String.fromCharCode(reminder+55));
    }else{
        result.push(reminder);
    }
    a=quotient;
}

//최종 남은 몫을 result array에 push 한다

if(a>=10){
    result.push(String.fromCharCode(a+55));
}else{
    result.push(a);
}
console.log(result.reverse().join(''));

 

1. a를 b보다 작아질 때까지 나누어준다

2. 나누었을때의 몫과 나머지를 각각 저장해준다. 이때 몫은 실수가 아니라 정수여야 하기때문에 Math.trunc를 해줘야 한다.

3. 나머지가 10보다 크거나 같으면 알파벳으로 바꿔줘야되기 때문에 String.fromCharCode(reminder+55)를 하고 result에 푸시한다

3-1. 나머지가 10보다 작으면 그냥 result에 푸시하면 된다.

4. 계산후 몫은 다음 계산을 위해 a로 업데이트 해준다.

5. 반복문을 빠져나오면 빠져나올때 가지고 나온 나머지를 result에 넣어주어야 한다.

6. 3번 또는 3-1번의 조건문을 실행한다.

7. 마지막으로 result를 출력해주면 되는데, 여기서 중요한것은 result를 reverse 해줘야 한다. (이유는 아래 참고 링크에 있는 그림 확인)

 

https://arnopark.tistory.com/633