본문 바로가기
Algorithm/BOJ

[BOJ]11576번: Base Conversion(java, c++)

by HBGB 2019. 9. 25.

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

 

11576번: Base Conversion

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

www.acmicpc.net

 

 

방법 1: StringTokenizer로 수를 받아서 10진수로 바꾼 다음, 반복문을 통해 B로 나눠가며 나머지 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.*;
import java.util.*;
 
public class Main{
    public static void main(String[] args) {
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            StringBuilder sb = new StringBuilder();
            
            int iA = Integer.parseInt(st.nextToken());
            int iB = Integer.parseInt(st.nextToken());
            int iNumCount =  Integer.parseInt(br.readLine());
            st = new StringTokenizer(br.readLine());
            int iDecimal = 0;
            
            while (iNumCount-- > 0) {
                iDecimal += Integer.parseInt(st.nextToken()) * Math.pow(iA, iNumCount);
            }
            
            Stack<Integer> stack = new Stack<Integer>();
            
            while (iDecimal != 0) {
                stack.add(iDecimal % iB);
                iDecimal = iDecimal / iB;
            }
            
            while (!stack.isEmpty()) {
                sb.append(stack.pop()).append(" ");
            }
            
            System.out.println(sb.toString());
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Colored by Color Scripter

 

 

방법 2: 배열로 수를 받아서 10진수로 바꾼 다음, 재귀함수를 통해 나머지 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.*;
 
public class Main{
    static BufferedWriter bw;
 
    public static void main(String[] args) {
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
            String[] arrNums = br.readLine().split(" ");
 
            int iA = Integer.parseInt(arrNums[0]);
            int iB = Integer.parseInt(arrNums[1]);
            int iNumCount = Integer.parseInt(br.readLine());
 
            arrNums = br.readLine().split(" ");
            int iDecimal = 0;
 
            for (int i = 0; i < iNumCount; i++) {
                iDecimal = iDecimal * iA + Integer.parseInt(arrNums[i]);
            }
 
            convert(iDecimal, iB);
            bw.flush();
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static void convert(int num, int multiplier) throws IOException {
        if (num == 0) {
            return;
        }
 
        convert(num / multiplier, multiplier);
        bw.write(num % multiplier + " ");
    }
}
Colored by Color Scripter

 

c++소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <algorithm>
 
using namespace std;
 
// 앞자리부터 출력
void convert(int dcm, int base)
{
    if (dcm == 0)
    {
        return;
    }
 
    convert(dcm / base, base);
    cout << dcm % base << ' ';
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int A, B, m;
    cin >> A >> B >> m;
    
    // abc(x) = a * x^2 + b * X^1 + c
    int dcm = 0;
    while (m--)
    {
        int sngl;
        cin >> sngl;
 
        dcm *= A;
        dcm += sngl;
    }
    
    convert(dcm, B);
 
    return 0;
}
Colored by Color Scripter

 

 

 

방법 1: StringTokenizer로 수를 받아서 10진수로 바꾼 다음, 반복문을 통해 B로 나눠가며 나머지 구하기

방법 2: 배열로 수를 받아서 10진수로 바꾼 다음, 재귀함수를 통해 나머지 구하기

 

BOJ 테스트 속도에는 차이가 없었다. 

 

 

TIP1

재귀함수를 통해 나머지 구하기

1
2
3
4
5
6
7
    public static void convert(int num, int multiplier) throws IOException {
        if (num == 0) {
            return;
        }
        convert(num / multiplier, multiplier);  // ---1
        bw.write(num % multiplier + " ");      // ---2
    }
Colored by Color Scripter

 

※ 주의! 

1번 재귀함수 호출 라인이 2번 현재의 나머지를 출력하는 라인보다 먼저 와야한다!

 

나머지 계산이 1의 자리부터 시작되기 때문에, 

수를 앞자리부터 순서대로 출력되게 하려면

가장 마지막에 호출되는 재귀함수의 나머지가장 먼저 출력되어야 한다. 

 

 

 

 

TIP2

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

 

2^20 = 1048576

이므로 int의 표현범위 한계보다 한참 작다. 

 

어쩐지 큰 수처럼 보여서 long형을 쓰지 말고, int형을 쓰도록 하자 ㅎㅎ

 

댓글