코딩테스트/알고리즘 문제

[백준] 2745 진법 변환 - Java

glorypang 2025. 3. 23. 17:46
728x90
반응형
SMALL

📌 문제 정보

  • 출처: 문제 링크
  • 난이도: ⭐ 
  • 문제 유형: 배열
  • 사용 언어: Java

🔍 문제 설명

B진법 수 N이 주어진다. 이 수를 10진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

 

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36)

B진법 수 N을 10진법으로 바꾸면, 항상 10억보다 작거나 같다.

 

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


💡 풀이 노트

진법 변환이란?

어떤 수를 특정 진법(기수법)에 따라 다른 형태로 표현하는 것을 말한다.

예를 들어, 16진수(HEX) `"1A"` 는 1X16^1 + 10X16^0 = 26 이 된다.

문자 `'A'` 는 16진수에서 10을 의미하며, 진법에 따라 `'A' ~ 'Z'` 는 `10 ~ 35` 까지 나타낼 수 있다.

 

추가 예시)

8진수 → 10진수 변환 `'271'` = 2X8^2 + 7X8^1 + 1X8^0 = 185

10진수 → 2진수 변환 `'20’` = 1X2^4 + 0X2^3 + 1X2^2 + 0X2^1 + 0X2^0

 

 

public static double to_number(String str, int n){
        double sum = 0;
        int power = str.length() - 1;
        for(char c : str.toCharArray()) {
            if (Character.isDigit(c))
                sum += (c - '0') * Math.pow(n, power--);
            else
                sum += (c - 55) * Math.pow(n, power--);
        }
        return sum;
    }
  1. `int power = str.length() - 1;`
    1. 진법 변환은 가장 앞자리가 가장 큰 자릿수이므로, 가장 높은 지수부터 시작
    2. 예: `'1A'` → `'1'` 은 16^1, `'A'` 는 16^0
  2. `for(char c : str.toCharArray())`
    1. 문자열을 문자 배열로 변환하여 하나씩 순회
for(char c : str.toCharArray()) {
	if (Character.isDigit(c))
		sum += (c - '0') * Math.pow(n, power--);
	else
    sum += (c - 55) * Math.pow(n, power--);
}
  1. `if (Character.isDigit(c))`
    1. 문자가 숫자(`0`~`9`)일 경우 `c - '0'`로 해당 숫자 값 얻기
  2. `else`
    1. 숫자가 아니라면 `A~Z`까지에 해당하는 숫자를 구함
    2. 문자가 알파벳(`A~Z`)인 경우, ASCII 값 기준으로 `A`는 65이므로 `c - 55`를 통해 `10`부터 시작하는 값을 얻음 예: `'A' - 55 = 65 - 55 = 10`
  3. `Math.pow(n, power--)`
    1. 해당 자리수의 가중치 계산: 진법의 거듭제곱 (예: `n^2`, `n^1`, ..., `n^0`)
    2. 각 자릿수의 값 × 가중치를 더해 최종 10진수 값 계산

🚀 코드 (Java)

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

public class Main{
    public static double to_number(String str, int n){
        double sum = 0;
        int power = str.length() - 1;
        for(char c : str.toCharArray()) {
            if (Character.isDigit(c))
                sum += (c - '0') * Math.pow(n, power--);
            else
                sum += (c - 55) * Math.pow(n, power--);
        }
        return sum;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        String str = st.nextToken();
        int n = Integer.parseInt(st.nextToken());

        System.out.printf("%.0f",to_number(str, n));
    }
}

🖥 실행 결과

입력
ZZZZZ 36

 

출력
60466175

 


📌 깃허브 코드 저장소: https://github.com/glorypang/CodingTest

 

 

 

728x90
반응형
LIST