10진법 정수 N이 주어졌을 때, 이를 B진법으로 변환하여 출력하는 문제이다.
단, 10 이상의 값은 다음과 같이 알파벳 대문자를 사용한다.
10 → A
11 → B
...
35 → Z
첫째 줄에 두 정수
N B
가 주어진다.
조건
2 ≤ B ≤ 36
N ≤ 1,000,000,000
10진법 정수 N을 B진법으로 변환한 값을 출력한다.
60466175 36
ZZZZZ
진법 변환의 기본 원리는 다음과 같다.
N을 B로 계속 나누면서 나머지를 구한다.
예를 들어
N % B → 현재 자리
N /= B → 다음 계산
이 과정을 반복하면 각 자리의 값이 구해진다.
단, 이 값들은
뒤에서부터 (거꾸로)
구해지기 때문에 마지막에 뒤집어야 한다.
나는 결과를 char 배열에 저장한 뒤
마지막에 거꾸로 출력하는 방식으로 구현했다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int B = sc.nextInt();
char[] result = new char[30];
Arrays.fill(result,' ');
int i = 0;
while(N > 0) {
if(N % B == 0) {
result[i] = '0';
i++;
N /= B;
} else {
int tmp = N % B;
if(tmp > 9) {
result[i] = (char) ('A' + tmp - 10);
} else {
result[i] = (char) (tmp + '0');
}
i++;
N -= tmp;
N /= B;
}
}
for(int j = 29; j >= 0; j--) {
if(result[j] != ' ')
System.out.print(result[j]);
}
}
}
이 방식은
배열에 거꾸로 저장 → 뒤에서부터 출력
하는 구조이다.
강의에서는 문자열을 사용해서 더 간단하게 구현했다.
import java.util.Scanner;
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int B = sc.nextInt();
String ans = "";
while (N > 0) {
int digit = N % B;
if (digit < 10) ans += digit;
else ans += (char)('A' + digit - 10);
N /= B;
}
System.out.println(new StringBuilder(ans).reverse());
}
}
| 방식 | 특징 |
|---|---|
| 내 풀이 | 배열 사용, 직접 뒤집어서 출력 |
| 강의 풀이 | 문자열 + reverse 사용 |
두 방식 모두 핵심 아이디어는 같다.
나머지를 이용해 자리값을 구하고
거꾸로 뒤집는다
자리값 = N % B
N = N / B
이 과정을 반복하면 모든 자릿수를 구할 수 있다.
10 이상일 때
(char)('A' + 값 - 10)
예
10 → A
11 → B
나머지는 항상
가장 낮은 자리부터
구해지기 때문에 마지막에 뒤집어야 한다.
N을 B로 계속 나누기 때문에
O(log N)
이다.
최대 N ≤ 10억이므로 매우 빠르게 수행된다.
이 문제는 기본적인 진법 변환 문제로,
핵심은 나머지를 이용해 각 자릿수를 구하는 것이다.
처음에는 배열을 사용해 직접 뒤집는 방식으로 구현했지만,
강의에서는 문자열과 reverse()를 활용해 더 간단하게 해결했다.
즉,
나머지 계산 → 문자열 저장 → 뒤집기
가 가장 일반적인 진법 변환 패턴이다.