[BOJ] 2745. 진법 변환

강재훈·2026년 4월 20일

코테 알고리즘

목록 보기
1/9

문제

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.
10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)
B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

출력

첫째 줄에 B진법 수 N을 10진법으로 출력한다.

예제 입력

ZZZZZ 36

예제 출력

60466175

코드

// 진법 변환

package _00_TodayProblem.tp02._05_2745;

import java.util.*;
import java.io.*;

public class Solution {

	static int bToDecimal(char ch) {
		if (ch >= '0' && ch <= '9') {
			return ch - '0';
		} else {
			return ch - 'A' + 10;
		}
	}

	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("src/_00_TodayProblem/tp02/_05_2745/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;

		st = new StringTokenizer(br.readLine());
		String N = st.nextToken();
		int B = Integer.parseInt(st.nextToken());

		int sum = 0;

		for (int i = 0; i < N.length(); i++) {
			int num = bToDecimal(N.charAt(i));
			sum = sum * B + num;
		}
		System.out.print(sum);
		br.close();
	}
}

풀이

bToDecimal

  • Java에서는 문자끼리 연산하면 ascii 값으로 반환된다.
  • ascii 순서만 안다면, 일관된 값을 반환할 수 있다.
  • ascii 순서
    • 0 ~ 9, A ~ Z, a ~ b
  • 문자가 0 ~ 9 사이로 들어왔을 때
    • 문자 그대로 출력하면 되니, 문자형 0을 빼서 정수형 0을 반환한다.
  • 문자가 A ~ Z 사이로 들어왔을 때
    • 들어온 문자에 대해 알파벳 중 최솟값인 A를 빼서 A의 값이 0이 되도록 한다.
    • 이 때 0 ~ 9 사이의 값 뒤로 알파벳을 배치해야 올바른 정렬이 된다. 따라서, +10을 한다.

main

  • 진법을 계산하는 공식은 다음과 같다
    • ex) 8진수 : abcde
      • e값의 범위 : 0 ~ 7 = 8⁰ × (0 ~ 7)
      • d값의 범위 : 8 ~ 56 = 8¹ × (0 ~ 7)
        ...
      • a값의 범위: 4,096 ~ 28,672 = 8⁴ × (0 ~ 7)
  • 즉, 8ⁱ × 변환된 값(0 ~ 7 사이의 값) 이 된다.
  • bToDecimal 함수로 변환된 값을 num 변수에 받고, 예시 입력을 적용시키면,
    • Bⁱ * num 이라는 Java 공식이 나온다.
    • 이 때 i = 4, 3, 2, 1, 0 이라면
      • B⁴ * num + B³ * num + B² * num + B¹ * num + B⁰ * num
      • = ((((num * B + num)B + num)B * num)B + num
      • (이 때 각 num의 값은 같거나 다를 수 있음)
      • 이 되는데, 반복횟수에 따라서 동일한 제곱값을 갖는 걸 알 수 있다.
      • 이 계산 방법이 바로 sum = sum * B + num; 에 해당하는 내용이다.
profile
꿈을 향해 끊임없이 성장하기

0개의 댓글