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 | 
'Algorithm > BOJ' 카테고리의 다른 글
| [BOJ]11576번: Base Conversion(java, c++) (0) | 2019.09.25 | 
|---|---|
| [BOJ]2745번: 진법 변환(java, c++) (0) | 2019.09.25 | 
| [BOJ]17103번: 골드바흐 파티션(java, c++) (0) | 2019.09.24 | 
| [BOJ]2089번: -2진수(java, c++) (0) | 2019.09.23 | 
| [BOJ]1212번: 8진수 2진수(java, c++) (0) | 2019.09.23 | 
 
										
									
댓글