[백준/BOJ] 2745번 진법 변환 (Node js / Javascript)

2023. 9. 14. 17:39코딩 테스트 (BOJ)

2745번: 진법 변환 (acmicpc.net)

 

2745번: 진법 변환

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 

www.acmicpc.net

 

이 문제는 좀 더 예전에 풀었던 문제인데, 동아리 활동 중 학교 동생에게 문제를 알려주려고 하려보니 기억하는데 꽤나 시간이 걸리는 걸 보고, 역시 기록을 해놔야 겠다 생각이 들어서 지금이라도 쓰게 됐다.

 

문제해설

우선 B진법이라 하는 것은 곧 한 자리에 들어갈 수 있는 수의 개수가 B개 있다는 뜻이다. 그러니 그 자리에 들어갈 수 있는 수 중 가장 큰 수는 B-1이고, B가 되는 순간 0이 되어 다음 자리로 넘어간다.

Ex) 10진법 -> 가장 큰 수 : 9 ,

        2진법 -> 가장 큰 수 : 1,

      16진법 -> 가장 큰 수 : F (15)

      36진법 -> 가장 큰 수 : Z(35) 

 

그리고 이제 10진법의 만의 자리 수로 예를 들어 숫자의 구조를 살펴보자

98379 

당연한 소리지만 만의 자리 수에 있는 9와 1의 자리 수에 있는 9는 다른 숫자이다.

 

만의 자리(5번째)에 있는 9는 9 ( x 10000)이란 뜻을 포함하고 있기 때문이다.

그리고 이 x 10000의 10000을 한번 더 풀어보자면 10진법에서 다음 숫자로 넘쳐흘러 넘어가는 10이란 숫자의 4제곱이다.

 

이걸 토대로 98379라는 수를 이제 이렇게 풀어서 써 볼 수 있다.

(9 x 10^4) + (8 x 10^3) + (3 x 10^2) + (7 x 10^1) + (9 x 10^0)

 

 여기까지 왔다면 문제는 다 풀었다. 왜냐하면 이 논리는 모든 10진법 뿐만 아닌 모든 n진법을 관통하기 때문이다.

 

그 예로 이번엔 문제의 입력 예시인 36진법의 ZZZZZ를 풀어써보자. 문제에서 원하는 답은 10진법이니 10진법으로 표현해서 쓴다.

 

(35(Z) x 36^4) + (35(Z) x 36^3) + (35(Z) x 36^2) + (35(Z) x 36^1) + (35(Z) x 36^0)

 

이제 코드로 작성해보자.

 

 

전체코드
 
const fs = require("fs");
const input = fs.readFileSync("../input.txt").toString().trim().split(" ");

const nums = input[0].split("");
const arithmetic = input[1];  //N진법의 N == arithmetic
let sum = 0;


for (let i = 0; i < nums.length; i++) {
  let digits = nums.length - 1 - i;
  let w = Math.pow(arithmetic, digits); 
  if (nums[i].charCodeAt(0) >= 65 && nums[i].charCodeAt(0) <= 90) {   // A - Z 의 아스키코드는 65 - 90
    sum += (nums[i].charCodeAt(0) - 55) * w;
  }else{
    sum += nums[i] * w;
  }
}

console.log(sum);

 

최근 노마드 코더 니콜라스쌤의 동영상을 시청했는데 어려운 용어, 어려운 설명을 사용할 수록 해당 문제에 이해가 깊지 않은 것이다 라는 영상을 봤다. 그래서 앞으로 포스팅 글들은 초등학생에게 설명해준다는 생각으로 설명해야겠다.