본문 바로가기
알고리즘 스터디/백준 알고리즘 기초 1

[백준 2745번 진법 변환 - node.js] [알고리즘 기초 1/2]

by 레일라오리덕 2021. 8. 4.
728x90

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

 

2745번: 진법 변환

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

www.acmicpc.net

 

문제

 

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진법으로 출력한다.

 

예제 입출력

 

입력 출력
ZZZZZ 36 60466175

 

풀이[node.js]

 

 

728x90

이번 문제도 간단하게 진법 변환하는 방식을 코드로 구현해보았다.

ABCDE를 예시를 들자면, A가 36의 4승, B가 36의 3승...E가 36의 0승이다.

이를 배열로 이용하기 위해, 인덱스를 거꾸로 주는 reverse를 사용하였다.

이렇게되면, EDCBA로 배열이 바뀌면서, E가 36의 0승, A가 36의 4승으로 나타내기 쉬워진다.(E는 인덱스 0, A는 인덱스 4)

이렇게 뒤집어준 배열을 char에 담아주고, 진법은 base에 담아주었다.

0에서부터 char의 길이만큼 돌면서, char[i]의 값이 A~Z인 경우에는, 아스키코드를 이용하여 A는 65, Z는 90인데, 진법에서는 A가 10, Z가 35가 되므로, A~Z의 아스키코드값에서 -55를 해주면 각 대문자 알파벳별로 진법에 맞는 숫자가 나오게 된다.

이 값을 구하면, char[i]에 대입해주고, 그 값과 Math.pow라는 제곱함수를 이용하여, char[i]의 base제곱하기 인덱스를 넣어 주고, char[i]와 곱해주면 10진수 값이 나오게된다.

이 값을 result에 넣어서 반환해주면 된다.

만약, char[i]값이 A~Z가 아닌 숫자값이라면, 배열에는 String으로 들어가있기 때문에, 간단히 Number로 타입변환만해주고, 제곱한 값을 result에 넣어주면 된다. 

var fs = require('fs');
var inputs = fs.readFileSync('/dev/stdin').toString().split(' ');
var char = inputs[0].split('').reverse();
var base = Number(inputs[1]);
var result = 0;
for(var i=0; i<char.length;i++){
    if(char[i] >= 'A' && char[i] <= 'Z'){
        char[i] = char[i].charCodeAt(0)-55;
        result += char[i] * Math.pow(base,i);
    }else{
        char[i] = Number(char[i]);
        result += char[i] * Math.pow(base,i);
    }
}
console.log(result);
728x90

댓글