[백준] 2745. 진법 변환
2025. 9. 2. 23:35ㆍCS&알고리즘/백준
https://www.acmicpc.net/problem/2745

36진법이란?
10진법에서는 0 ~ 9까지만 한 자리로 표현하고,
36진법에서는 더 많은 숫자를 한 자리에 담기 위해 알파벳 대문자를 사용
- 0 ~ 9 → 숫자 그대로 (0 ~ 9)
- A ~ Z → 10 ~ 35
| 알파벳 | 숫자 | 알파벳 | 숫자 | 알파벳 | 숫자 | 알파벳 | 숫자 | 알파벳 | 숫자 | 알파벳 | 숫자 |
| A | 10 | F | 15 | K | 20 | P | 25 | U | 30 | Z | 35 |
| B | 11 | G | 16 | L | 21 | Q | 26 | V | 31 | ||
| C | 12 | H | 17 | M | 22 | R | 27 | W | 32 | ||
| D | 13 | I | 18 | N | 23 | S | 28 | X | 33 | ||
| E | 14 | J | 19 | O | 24 | T | 29 | Y | 34 |
문제 풀이
표에서 Z = 35,
"ZZZZZ" =
자리값 계산 방식
대부분 “첫 번째 자리”를 오른쪽(일의 자리)로 생각하는데 실제 코드는 왼쪽부터 차례대로 읽어도 문제가 없음!
차이는 계산 순서일 뿐, 결과는 동일
코드에서는 ans = ans * B + digit 연산이 기존 숫자를 한 자리 밀어주는 역할을 합니다.
- 첫 번째 자리(오른쪽 끝) = B의 0제곱
- 두 번째 자리 = B의 1제곱
- 세 번째 자리 = B의 2제곱
비교 예시 : 352
| 방식 | 계산 순서 | 과정 | 결과 |
| 수학적 방식 (오른쪽부터) |
일의 자리 → 십의 자리 → 백의 자리 |
300 + 50 + 2 = 352 | |
| 코드 방식 (왼쪽부터) |
왼쪽부터 누적 |
제출 코드
- digit : 현재 문자가 나타내는 실제 숫자값 (0~35)
- ans * B + digit : 기존 결과를 한 자리 올리고, 새로운 숫자를 더함
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String N = st.nextToken().trim();
int B = Integer.parseInt(st.nextToken());
long ans = 0;
for (int i = 0; i < N.length(); i++) {
char ch = N.charAt(i);
int digit;
if ('0' <= ch && ch <= '9') {
// 숫자 처리
digit = ch - '0';
} else {
// 알파벳 처리
digit = ch - 'A' + 10;
}
ans = ans * B + digit;
}
System.out.println(ans);
}
}
다른 풀이 방식
- 자바 내장 메서드를 이용하여 풀이
- Integer.parseInt(N, B) : 문자열 N을 B진법으로 해석해 10진수 int로 변환
- 단, 결과가 int 범위를 벗어나면 NumberFormatException 발생 → 필요시 Long.parseLong(N, B) 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String N = st.nextToken();
int B = Integer.parseInt(st.nextToken());
// 내장 메서드로 진법 변환
int ans = Integer.parseInt(N, B);
System.out.println(ans);
}
}
'CS&알고리즘 > 백준' 카테고리의 다른 글
| [백준] 10870. 피보나치수 5 (0) | 2025.10.10 |
|---|---|
| [백준] 27433. 팩토리얼2 (0) | 2025.10.10 |