문제
문제: 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
풀이
const fs = require('fs');
const [N, B] = fs.readFileSync(0, 'utf-8').trim().split(' ');
let num = parseInt(N); // 10진수
const base = parseInt(B);
let result = '';
while (num > 0) {
const remainder = num % base;
// 숫자가 0~9면 그대로, 10~35면 A~Z로 변환
const digit = remainder < 10
? String(remainder)
: String.fromCharCode(remainder + 55); // 10 → A, 11 → B, ..., 35 → Z
result = digit + result;
num = Math.floor(num / base);
}
console.log(result);
풀이 해석
순서
a. N을 B로 나눈 나머지를 구한다. 60466175 / 36
b. N을 B로 나눈 몫을 다음 계산에 넘긴다.
c. 몫을 다시 36으로 나누어 0이 될 때까지 반복한다.
d. 나머지들을 뒤집어서 출력한다.
*핵심 공식*
while (숫자 > 0):
나머지 = 숫자 % 진법
결과 앞에 추가
숫자 = Math.floor(숫자 / 진법)
1. 백준 표준 입력을 받아와서 trim으로 앞뒤 공백을 제거한후 split(' ')으로 띄어쓰기를 기준으로 배열 N과 B에 각각 할당한다.
2. N과 B를 parseInt하여 숫자 타입으로 변환한다.(Number(N))사용해도 된다.
3. while문을 사용하여 10진수의 숫자가 0보다 크다면 순회한다.
4. num % base : 현재 숫자를 진법으로 나눴을 때의 나머지이다. 즉, 오른쪽 끝(가장 낮은 자리)숫자부터 계산된다.
5. fromCharCode(remainder + 55) : remainder가 10이면 65('A')이고, remainder가 35이면 90('Z')가 된다.
6. result = digit + result : 계산한 나머지(digit)는 진법 변환 시 가장 뒤(오른쪽)자리에 해당하는 숫자이기때문에, 이를 result문자열의 맨 앞에 붙인다. 이렇게 해야 최종적으로 왼쪽에서 오른쪽으로 올바른 자리 순서로 숫자가 쌓이게 된다.
7. num = Math.floor(num/base) : 이미 사용한 자리(나머지)를 제외하고, 남은 몫만을 다음 반복에 사용하기 위해 숫자를 진법으로 나누고, 그 결과를 num에 다시 저장한다. 이 과정을 통해 자릿수를 하나씩 줄여나간다.
더 알아보기
1. 예외 케이스
if (num === 0) {
console.log(0);
return;
}
- 만약 num === 0이면 반복문이 안돌아서 출력이 안된다. 그래서 맨 위에 예외처리를 하나 넣어도 좋다.
2. 풀이 예제로 보기
계속 36으로 나누면 :
60466175 % 36 = 35 → 'Z'
1679615 % 36 = 35 → 'Z'
46655 % 36 = 35 → 'Z'
1295 % 36 = 35 → 'Z'
35 % 36 = 35 → 'Z'
따라서 결과는 'ZZZZZ'가 된다.
3. String.fromCharCode()
- 이 메서드는 UTF-16 코드 유닛의 시퀀스로부터 문자열을 생성해 반환한다.
- 숫자 10 → 'A' = 10+55=65 → 'A'.charCodeAt(0) = 65
- 숫자 35 → 'Z'.charCodeAt(0) = 90
그래서 String.fromCharCode(10+55) → 'A'
어제 블로그에 정리한 알고리즘 문제가 진법변환 N진법을 10진법으로 바꾸는거여서 10진법을 N진법으로 바꾸는것도 같이 정리했었는데, 오늘 알고리즘 문제가 10진법을 N진법 변환이였다니!! 미리 공부해 둔 내용이라 빠르게 정리했다.
'알고리즘 Node.js' 카테고리의 다른 글
백준 2903문제. 중앙 이동 알고리즘 (0) | 2025.04.06 |
---|---|
백준 2720문제. 세탁소 사장 동혁 (0) | 2025.04.05 |
백준 2745문제. 진법 변환(일반수학1 시작!) (0) | 2025.04.03 |
백준 2563문제. 색종이(어렵다,,,) (0) | 2025.04.02 |
백준 10798문제. 세로읽기 (0) | 2025.04.01 |