
어디서 많이 해본 진법변환 문제.. 보통 2진수, 8진수, 16진수로만 바꿨는데 36진법으로도 바꿔보았다. 사실 방법은 같으니까...
1. 진법 배열을 미리 만들고 2. 값을 입력받은 후 나누기 계산을 통해 진법 출력한다. 이때 재귀를 이용한다. 나는 재귀가 좋아..
1. 진법 배열 미리 만들기
0 1 2 3 ... Y Z
[0] [1] [2] [3] ... [34] [35]
이런식으로 미리 저장해둔다. for문을 쓸까 하다가 ..알파벳부터는 또 새로 만들어야 하니까 귀찮아서 아예 초기값으로 줘버렸다.
예를들어 8진법이면 0~7 까지만 사용할거고 실제 출력값은 Bformation[0] ~ [7]이 될거다. ('0' ~ '7')
이렇게 한 이유는 알파벳 때문이다. 숫자 0~9가 아닌 문자 '0'~'9'와 'A'~'Z'를 저장한다.
// 진법 표만들기, 최대 36진법이니까.. 36칸이 필요(0~35)
char[] Bformation = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'};
2. 재귀 이용해서 출력하기
B진법으로 만드는 방법은 계속 N을 B로 나누고, 또 그 나눈 몫을 또 나누고.. 나누다가 N이 0이 되면, 여태 계산된 나머지를 반대로 출력하는 것이다.
10으로 예를 들면.. 10 / 2 = 5 ... 0 -> 5 / 2 = 2 ... 1 -> 2 / 2 = 1 ... 0 -> 1 / 2 = 0 ... 1 답: 1010
반대로 출력하기위해.. 예전에는 막 for문을 쓰고, 반대로 저장해서 다시 반대로 출력하고 그랬는데, 굳이 어딘가에 저장할 필요는 없다. 그냥 출력하면 된다.
나머지 인덱스에 맞는 진법표(Bformation)를 출력한다. 10이라면 Bformation[1], Bformation[0], Bformation[1], Bformation[0] 이 순서대로 출력될 것이다.
public static void makeNtoB(int N, int B, char[] Bformation){
if(N < B){
System.out.print(Bformation[N % B]);
return;
}
else{
makeNtoB(N / B, B, Bformation);
System.out.print(Bformation[N % B]);
}
}
아래는 전체 코드이다.
import javax.imageio.IIOException;
import java.io.*;
import java.util.StringTokenizer;
public class BOJ11005 {
public static void makeNtoB(int N, int B, char[] Bformation){
if(N < B){
System.out.print(Bformation[N % B]);
return;
}
else{
makeNtoB(N / B, B, Bformation);
System.out.print(Bformation[N % B]);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N, B, i;
String str;
StringTokenizer st;
str = br.readLine();
st = new StringTokenizer(str);
N = Integer.parseInt(st.nextToken());
B = Integer.parseInt(st.nextToken());
// 진법 표만들기, 최대 36진법이니까.. 36칸이 필요(0~35)
char[] Bformation = {'0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z'};
makeNtoB(N, B, Bformation);
}
}
'코딩가딩가' 카테고리의 다른 글
| [JAVA]BOJ 3058, 짝수를 찾아라 (0) | 2024.07.17 |
|---|---|
| [JAVA]BOJ 11068, 회문인 수 (0) | 2024.07.17 |
| [JAVA]BOJ 10448, 유레카 이론 (0) | 2024.07.13 |
| [C]BOJ 9095, 1, 2, 3 더하기 (0) | 2024.07.12 |
| [C]BOJ 1748, 수 이어 쓰기 1 (0) | 2024.07.12 |