본문 바로가기
JS/백준

[백준JS] 2745. 진법 변환

by 박기린 2023. 4. 1.

안녕하세요. 박기린 입니다.

백준 2745번 진법 변환 문제를 풀어봅시다.

 

 

문제 링크

https://www.acmicpc.net/problem/2745

 

 

 


문제 해석

입력으로 들어오는 값은 N과 B입니다.

B는 진법을 나타내며, 최대 36진법까지 입력을 받습니다.

N은 'B진법에 해당하는 수' 입니다.

 

 

 

특정 진법을 10진법으로 바꾸는 방법은 위의 그림과 같습니다.

1. 숫자를 자릿수별로 나눕니다. 
2. '해당 자릿수의 순서 - 1'값을 진법의 제곱수로 곱합니다. ( 36진법의 4번째 자릿수이면 36 ** 3 )
3. 2단계에서 계산한 값을 해당 자릿수에 곱합니다. ( Z는 10진법 기준으로 35를 의미합니다 => 35 * (36 ** 3) )
4. 그렇게 모든 자릿수를 계산한 후, 전부 더하면 10진법으로 변환이 됩니다.

 

 

 

 


정답 코드

const fs = require("fs");
let [n, b] = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
let result = 0;

n = n.split("").reverse();
b = +b;

for (let i = 0; i < n.length; i++) {
  const utf = n[i].charCodeAt();

  if (utf >= 65 && utf <= 90) {
    // A to Z
    result += (utf - 55) * b ** i;
  } else {
    // number
    result += Number(n[i]) * b ** i;
  }
}

console.log(result);

 

 

 

 

 

 


정답 코드 풀이

const fs = require("fs");
let [n, b] = fs.readFileSync("/dev/stdin").toString().trim().split(" ");
let result = 0;

n = n.split("").reverse();
b = +b;

입력받은 값을 n과 b로 비구조화 한 후, n은 역순으로 재구조화, b는 number 타입으로 변환을 합니다.

 

 

 

 

for (let i = 0; i < n.length; i++) {
  const utf = n[i].charCodeAt();

  if (utf >= 65 && utf <= 90) {
    // A to Z
    result += (utf - 55) * b ** i;
  } else {
    // number
    result += Number(n[i]) * b ** i;
  }
}

n의 길이만큼 반복하는 반복문을 만듭니다.

utf 상수에는, n의 i번째 인덱스에 해당하는 값의 UTF-16 값을 저장합니다.

 

UTF-16 코드 값은 65부터 90까지는 대문자 A부터 Z까지의 값이 담겨 있습니다. 따라서 if 문으로 구분을 해줍니다.

- 해당 자릿수의 값이 영어대문자인 경우, 우선 UTF-16 코드 값에 55를 빼줍니다. 그러면 [A:10 ... - ...  Z:35]가 됩니다. 그리고 'b의 i제곱'을 곱합니다. (i는 자릿수를 의미합니다.)

- 해당 자릿수의 값이 숫자인 경우, 자릿수의 값에 'b의 i제곱'을 곱합니다.

 

 

그리고 결과값을 출력하면 끝입니다.

반응형

'JS > 백준' 카테고리의 다른 글

[백준JS] 2903. 중앙 이동 알고리즘  (0) 2023.04.10
[백준JS] 11005. 진법 변환 2  (0) 2023.04.04
[백준JS] 2563. 색종이  (0) 2023.03.31
[백준JS] 1316. 그룹 단어 체커  (0) 2023.03.24
[백준JS] 10812. 바구니 순서 바꾸기  (0) 2023.03.18