on
[JAVA] 11576번 - Base Conversion
[JAVA] 11576번 - Base Conversion
출처 - https://www.acmicpc.net/problem/11576
문제
타임머신을 개발하는 정이는 오랜 노력 끝에 타임머신을 개발하는데 성공하였다. 미래가 궁금한 정이는 자신이 개발한 타임머신을 이용하여 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진법으로 변환하여 출력한다.
예제 입력 1 17 8 2 2 16
예제 출력 1 6 2
< 소스 코드>
import java.io.*; import java.util.Stack; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); StringTokenizer st = new StringTokenizer(br.readLine()); int a = Integer.parseInt(st.nextToken()); // a진법 int b = Integer.parseInt(st.nextToken()); // b진법 int m = Integer.parseInt(br.readLine()); // a진법으로 나타낸 숫자의 개수 st = new StringTokenizer(br.readLine()); int decimal = 0; // 10진수 while(m-- >0){ decimal += Integer.parseInt(st.nextToken()) * Math.pow(a, m); // a진법 -> 10진법 } Stack stack = new Stack<>(); while(decimal != 0){ stack.push(decimal % b); decimal /= b; } while(!stack.isEmpty()) bw.write(stack.pop()+" "); bw.flush(); bw.close(); br.close(); } }
일단 이 문제의 내용이 살짝 길기때문에 이해하기 힘든 부분이 있을 수 있다.
하지만 이 문제에서 요구하는 것은 단지 A진법에서 B진법으로 변환하는 문제 다.
일단 입력 부분에는 총 3줄로 입력하며,
1. 기존의 A진법과 변환할 B진법
2. B진법으로 변환할 것인데, A진법의 길이(자릿수)가 어느정도인지 변수 m을 입력
3. A진법은 어떤 숫자로 이루어져 있나? 자릿수가 높은 순대로 차례대로 공백문자 기준으로 입력
간단하게 A진법을 B진법으로 변환하기 위해, 일단 A진법을 10진법으로 변환 하는게 좋다고 생각한다.
그러기 위해서, while문을 통해 입력 받은 A진법의 자릿수 m을 감소하면서 10진법을 나타내는 decimal 변수에
자릿수가 높은 순대로 Math 클래스의 거듭 제곱을 구하는 함수인 pow()를 이용하여 서로 곱한다.
이 과정을 A진법의 길이만큼 반복하다보면 10진수를 구할 수 있다.
A진법 -> 10진법 변환이 성공하면, B진법으로 변환하는 과정이 필요한데,
이 과정에서 Stack을 사용한다. Stack은 LIFO 방식이기 때문에 진법변환하기 위해
10진수와 B진법을 %연산자로 나온 나머지를 삽입하고 출력할 때, 가장 나중에 들어간 나머지부터 출력이 되니 진법변환에 적합 하다. 그리고 10진수를 B진법을 나누는 과정을 반복한다.
그리고 Stack의 Pop() 함수를 통해 결과를 출력한다.
from http://puzzle-moon.tistory.com/78 by ccl(A) rewrite - 2021-12-27 17:01:02