문제

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

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

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

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

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

예제

예제 입력 1

1
2
ZZZZZ 36

예제 출력 1

1
60466175

내 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
let [N, B] = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split(" ");

const ALPHABET_CODE = 10;
const UPPER_A_CODE = 65;
const alphabets = {};

for (let i = 0; i < 26; i++) {
const alphabet = String.fromCharCode(UPPER_A_CODE + i);
alphabets[alphabet] = ALPHABET_CODE + i;
}

let answer = 0;
let pow = 0;
while (N.length !== 0) {
const newN = alphabets[N.slice(N.length - 1)]
? +alphabets[N.slice(N.length - 1)]
: +N.slice(N.length - 1);
let d = B ** pow;
answer = d * newN + answer;
N = N.slice(0, N.length - 1);
index++;
}

console.log(answer);
  1. 알파벳 객체를 만들고 이전 문제인 10진법을 36진법으로 바꾸는 로직을 역순으로 짜보았다.
  2. 첫번째 자릿수부터 $36^0*(1의 자리수)$, $36^1*(10의 자리수)$… 이런식으로 10진법의 숫자로 변환할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 또 다른 해답
let [N, B] = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split(" ");

let answer = 0;
const reversed = N.split("").reverse();
for (let i = 0; i < N.length; i++) {
if (reversed[i] >= "A" && reversed[i] <= "Z") {
reversed[i] = reversed[i].charCodeAt(0) - 55;
answer += reversed[i] * Math.pow(B, i);
} else {
answer += reversed[i] * Math.pow(B, i);
}
}

console.log(answer);
  • 알파벳 코드를 굳이 만들지 않고 부등호를 사용하여 구하여 코드가 간결해졌다.
  • 지수를 계산할 때, Math.pow() 메서드를 사용하여 깔끔하다.