본문 바로가기
Java

[백준] 코딩테스트 문제 2745: 진법 변환

by 리슈다 2026. 3. 16.

https://www.acmicpc.net/problem/2745

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

public class Main {
    public static void main(String[] args) throws IOException {
        Map<String, Integer> map = new HashMap<>();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int result = 0;

        for (int i = 0; i <= 35; i++) {
            if(i >= 10){
                char ch = (char)(55 + i);
                map.put(String.valueOf(ch), i);
            } else {
                map.put(String.valueOf(i), i);
            }
            
        }

        StringTokenizer st = new StringTokenizer(br.readLine());
        String str1 = st.nextToken();
        int n = Integer.parseInt(st.nextToken());
       
        for(int i = 0; i < str1.length(); i++){
            int num = map.get(String.valueOf(str1.charAt(i))); 
            double temp = num * Math.pow(n, (str1.length() - 1 - i));
            result = result + (int)temp;
        }
       
        
        System.out.println(result);
    }
}

11진법부터 알파벳이 숫자를 대신하기 때문에 이를 쌍으로 연결시켜주어야겠단 생각에 Map을 사용했다.

10진법을 넘어가는 진법에서는 A:10, B:11, ... Z:35이므로, 첫번째 for문을 통해 Map.put으로 넣어주었다.

이후 StringTokenizer로 값을 입력받고 st.nextToken()을 통해 공백을 기준으로 값을 나누어 할당했다.

처음에 입력받은 B진법 수 N의 길이만큼 두번째 for문을 반복한다.

두번째 for문은 입력받은 문자를 Map에 매칭된 실제 숫자값으로 가져온 후 B진법을 10진법으로 변환한다.

map.get을 통해 순서대로 문자값을 가져오고,

num * Math.pow(n, (str1.length() - 1- i))를 통해 자리별 값을 구한다.

Math.pow는 거듭제곱을 표현하기 위해 사용했고, n은 입력받은 B진법,

str1.length - 1 - i는 원래 자리수 뒤에서부터 0승, 1승, ... 이렇게 나가야 하지만 앞쪽부터 세고 있으므로 (문자열 전체 길이 - 1 - i)를 통해 거듭제곱할 수를 구해주었다. 그리고 이 값을 문자열 각 자리 문자에 해당하는 수(map으로 가져온 수)와 곱해서 자리수 별 10진수 값을 구한다.

이후 구한 값들을 result += (int)temp;로 더해준다..

 

말로 푸니까 상당히 더러운데.. 일단 <문자/숫자,. 숫자> 매칭된 Map을 사용했고, 각 자리수별 진법 변환을 수행했다..는 것을 알아두자.

 

지피티한테 도움 받은 것

진법 계산 공식: num * n^(자리번호)

^연산자 오해: ^은 XOR, 거듭제곱은 Math.pow

형변환: (int)temp를 int(temp)로 썼었음

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 str = st.nextToken();
        int base = Integer.parseInt(st.nextToken());

        int result = 0;

        for(int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int value;

            if(c >= '0' && c <= '9') {
                value = c - '0';
            } else {
                value = c - 'A' + 10;
            }

            result += value * Math.pow(base, str.length() - 1 - i);
        }

        System.out.println(result);
    }
}

Map을 사용하지 않고 문자 계산 사용하는 방법도 있다. 이게 훨씬 깔끔하네..

 

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 str = st.nextToken();
        int base = Integer.parseInt(st.nextToken());

        int result = 0;

        for(int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            int value;

            if(c >= '0' && c <= '9') {
                value = c - '0';
            } else {
                value = c - 'A' + 10;
            }

            result = result * base + value;
        }

        System.out.println(result);
    }
}

그리고 Math.pow()를 사용하지 않고 누적 계산 방식을 사용하는 방법.

진법 문제들은 이걸 생각하면(외워두면) 좋을 듯

result = result * base + 현재자리값 (base: 진법)