본문 바로가기
Baekjoon

[백준] 2745번 진법 변환 (Java)

by Chaewon Park 2024. 2. 12.

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

 

2745번: 진법 변환

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

www.acmicpc.net

 


문제


알고리즘

 

문제에 풀기에 앞서 10진수가 B진법으로, B진법이 10진수로 어떻게 변환되는지 원리를 기억해야 한다.

 

내가 간단하게 정리하면 이렇게 표현할 수 있다. 

그렇다면 우리가 알아야 할 것은 N의 길이B만 안다면 해결할 수 있다!

 

1. B진법으로 표현한 N과 몇 진법인지 표시한 B를 입력받는다.

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

 

2. N의 가장 끝부터 순차적으로 B^0, B^1 ... 을 곱해주기 시작한다. 이때, A ~ Z인 것은 아스키 코드를 사용하여 다시 숫자로 만들어준다.

int result = 0;
int tmp = 1;
for(int i=N.length()-1; i>=0 ;i--) {
    char c =  N.charAt(i);
    int n;

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

    result += n*tmp;
    tmp *= B;
}

 


풀이
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String [] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

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

        int result = 0;
        int tmp = 1;
        for(int i=N.length()-1; i>=0 ;i--) {
            char c =  N.charAt(i);
            int n;

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

            result += n*tmp;
            tmp *= B;
        }

        br.close();
        bw.write(Integer.toString(result));
        bw.flush();
        bw.close();
    }
}