문제
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
내 코드
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);
|
- 알파벳 객체를 만들고 이전 문제인 10진법을 36진법으로 바꾸는 로직을 역순으로 짜보았다.
- 첫번째 자릿수부터 $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() 메서드를 사용하여 깔끔하다.