https://www.acmicpc.net/problem/11005
방법 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 |
댓글