본문 바로가기
Algorithm/BOJ

[BOJ]11005번: 진법 변환 2(java, c++)

by HBGB 2019. 9. 25.

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

 

11005번: 진법 변환 2

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오. 10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다. A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

www.acmicpc.net

 

 

방법 1 : stack 사용해서 결과 뒤집기

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
42
43
import java.io.*;
import java.util.StringTokenizer;
import java.util.Stack;
 
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();
            Stack<Character> stack = new Stack<Character>();
 
            int num = Integer.parseInt(st.nextToken());
            int demonimator = Integer.parseInt(st.nextToken());
            
            while (true) {
                int rest = num % demonimator;
                
                if (rest >= 10) {
                    rest = rest + 55;
                } else {
                    rest = rest + 48;
                }
                
                stack.add((char)rest);
                num = num / demonimator;
 
                if (num == 0) {
                    break;
                }
            }
 
            while (!stack.isEmpty()) {
                sb.append(stack.pop());
            }
            System.out.println(sb.toString());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Colored by Color Scripter

 

 

방법 2 : StringBuilder reverse() 함수 사용해서 결과 뒤집기

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
import java.io.*;
import java.util.StringTokenizer;
 
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 num = Integer.parseInt(st.nextToken());
            int demonimator = Integer.parseInt(st.nextToken());
            
            while (true) {
                int rest = num % demonimator;
                
                if (rest >= 10) {
                    sb.append((char)(rest + 55));
                } else {
                    sb.append(rest);
                }
                
                num = num / demonimator;
 
                if (num == 0) {
                    break;
                }
            }
 
            System.out.println(sb.reverse());
 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Colored by Color Scripter

 

 

방법 3 : 숫자들을 문자열로 미리 저장해두고 불러다 쓰기 (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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
string get_xbase_num(int n, int x)
{
    // 0~35까지의 숫자
    string nums = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    string ans = "";
 
    while (n > 0)
    {
        ans += nums[n % x];
        n /= x;
    }
 
    reverse(ans.begin(), ans.end());
 
    return ans;
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    int N, B;
    cin >> N >> B;
 
    cout << get_xbase_num(N, B);
 
    return 0;
}
Colored by Color Scripter

 

 

 

 

 

진법 변환 문제는 거의 비슷하다. 

N을 K진법으로 표현하고자 한다면,

N/K == 0 이 될때까지 계속 나누면서 나머지를 구하기

1
2
3
4
while (N != 0) {
    int rest = N % K;
   N = N / K;
}
Colored by Color Scripter

 

 

 

 

TIP1

 

방법 1 : stack 사용해서 결과 뒤집기

방법 2 : StringBuilder reverse() 함수 사용해서 결과 뒤집기

방법 3: 숫자들을 문자열로 미리 저장해두고 불러다 쓰기. 제일 보기 깔끔하다 (20200426 추가)

 

큰 차이는 없다. 방법 1이 아주아주 근소한 차이로 더 빠르긴 하다.

다만 내가 StringBuilder reverse() 기능이 있는지 처음 알아서 글을 쓴다. 간단하네...^^

 

 

 

TIP2

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.
A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

문제에서 10진법이 넘어가면 알파벳을 사용하여 표기해야 하므로,

아스키 코드 값을 이용해서 문제를 풀면 편리하다. 

알고리즘 문제 풀다보면 몇개 문자의 아스키 코드값은 그냥 외워지는 것 같다 A=65 라든지..

 

 

참고)

Character ASCII Code value
0 ~ 9 48 ~ 57
A ~ Z 65 ~ 90
a ~ z 97 ~ 122

 

 

 

댓글