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

[백준 11576번 Base Conversion - node.js] [알고리즘 기초 1/2]

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

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

 

11576번: Base Conversion

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의

www.acmicpc.net

 

문제

 

타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 500년 후의 세계로 여행을 떠나게 되었다. 500년 후의 세계에서도 프로그래밍을 하고 싶었던 정이는 백준 사이트에 접속하여 문제를 풀기로 하였다. 그러나 미래세계는 A진법을 사용하고 있었고, B진법을 사용하던 정이는 문제를 풀 수가 없었다. 뛰어난 프로그래머였던 정이는 A진법으로 나타낸 숫자를 B진법으로 변환시켜주는 프로그램을 작성하기로 하였다.

N진법이란, 한 자리에서 숫자를 표현할 때 쓸 수 있는 숫자의 가짓수가 N이라는 뜻이다. 예를 들어 N은 17일 때 한 자릿수에서 사용할 수 있는 수는 0, 1, 2, ... , 16으로 총 17가지가 된다.

 

입력

 

입력의 첫 줄에는 미래세계에서 사용하는 진법 A와 정이가 사용하는 진법 B가 공백을 구분으로 주어진다. A와 B는 모두 2이상 30이하의 자연수다.

입력의 두 번째 줄에는 A진법으로 나타낸 숫자의 자리수의 개수 m(1 ≤ m ≤ 25)이 주어진다. 세 번째 줄에는 A진법을 이루고 있는 숫자 m개가 공백을 구분으로 높은 자릿수부터 차례대로 주어진다. 각 숫자는 0이상 A미만임이 보장된다. 또한 수가 0으로 시작하는 경우는 존재하지 않는다.

A진법으로 나타낸 수를 10진법으로 변환하였을 때의 값은 양의 정수이며 220보다 작다.

 

출력

 

입력으로 주어진 A진법으로 나타낸 수를 B진법으로 변환하여 출력한다.

 

예제 입출력

 

입력 출력
17 8
2
2 16
6 2

 

풀이[node.js]

 

 

728x90

솔직히 이번 문제는 어렵지는 않았지만, 처음에 문제를 이해하는데 애를 좀 먹었다.

1번째 줄에 있는 숫자 둘은 A진법(미래 진법), B진법(현재 진법) 이라는 것은 이해했지만,

2번째 줄에 있는 숫자가 A진법의 자릿수 라는게 무슨 말인가 싶었다.

문제의 예시에서는 A진법이 17진법이므로, 2자릿 수라는 것은, 3번째 줄에 있는 숫자의 갯수를 의미하는 것이고,

그 말인 즉슨, 2개의 숫자는 17의 1승, 17의 0승에 각각 오는 숫자들이 세번째 줄에 있는 것이고, 2번째 줄에서 말하는 자릿수는 2개의 자릿수, 즉, 17의 0승, 17의 1승 이렇게 두자리가 있다는 것이었다ㅠㅠ

이해하고 보면 당연한 문제 설명인데, 이해하기 전에는 왜 이렇게 헷갈렸는지...

 

아무튼, a진법, b진법을 a와 b로 구했고, 자릿수의 길이를 len으로 받아서 len의 길이만큼 돌면서 Math.pow를 이용하여 17진수의 값을 17의 i승, 인덱스 승으로 구했고, 그 값에 value를 곱해주어서 17의 0승* 16, 17의 1승 * 2가 되도록 해주었다.

여기서 꼭 split된 값을 reverse해주어야한다! 그렇지 않을 경우, [2, 16]의 i의 값으로 구하면 17의 0승 * 2, 17의 1승* 16이 되버리기 때문이다!

 

이렇게 구하면  number값은 10진수로 50이 나오는데, 이 50을 소인수분해하여 8진법으로 나타내주면 된다.

몫이 0이 될때까지 나머지 값을 answer에 넣어주고, 그 answer값을 거꾸로 reverse시켜주어서 출력해주면 17진법 값이 8진법으로 변환되서 출력된다.

var fs = require('fs');
var inputs = fs.readFileSync('/dev/stdin').toString().split('\n');
var a = Number(inputs[0].split(' ')[0]);
var b = Number(inputs[0].split(' ')[1]);
var len = Number(inputs[1]);
var number = 0;
var answer = [];
for(var i = 0; i<len; i++){
    var value = inputs[2].split(' ').reverse()[i];
    number += Math.pow(a,i) * value;
}
while(number/b !==0){
    answer.push(number % b);
    number = Math.floor(number/b);
}
console.log(answer.reverse().join(' ').trim());

 

728x90

댓글