Java/코딩테스트

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

다아빈 2025. 4. 2. 20:27
728x90
반응형

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

문제 접근

이번 문제는 진법 계산하는 법만 안다면 그다지 어렵지 않은 문제였습니다!

그래서 문제 접근 방식을 설명드리는 것보다는 N진법을 10진법으로 바꾸는 방법을 설명해드리겠습니다.

 

어떤 진법으로 된 수라도 10진수로 변환하는 법은 똑같습니다!

각 자리의 수에 해당 단위의 값을 곱해서 더하면 됩니다! 글로 봐서 이해가 잘 안되실 수도 있는데 10진수 1029 라는 숫자를 예시로 들어보겠습니다! 1029를 풀어서 쓰면 다음과 같습니다:

이번에는 2진수 1010을 10진수로 변환해보겠습니다:

즉, N진수를 10진수로 변환하고 싶다면 가장 우측에 있는 수부터 차례로 N^0, N^1,N^2, ..., N^n을 곱하고 더해주면 됩니다!

단 9를 초과하는 수는 문제와 같이 알파벳으로 숫자를 표현한답니다! 그래서 알파벳이 있는 경우에는 "알파벳 -> 10진수"로 변환한 후, 문제를 풀어야 합니다.  마지막으로 16진수 64F를 10진수로 변환해보겠습니다:

 

제가 느꼈을 때 이 문제에서 포인트는 2가지였던 것 같습니다.

  1. 진법 변환을 이해해야 한다.
  2. 알파벳은 숫자로 어떻게 변환할 것인지?

전체 코드

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));

        String input = br.readLine();
        String num = input.split(" ")[0];
        int base = Integer.parseInt(input.split(" ")[1]);

        int sum = 0;
        int n = 0;
        int j = 0;

        for(int i = num.length() - 1; i >=0; i--) {
            if(base >= 10 && (num.charAt(i) >= 'A' && num.charAt(i) <= 'Z')) {
                n = num.charAt(i) - 55; // 'A'의 아스키 코드: 65
                sum += (int)Math.pow(base, j) * n;
            }else{
                sum += (int)Math.pow(base, j) * Integer.parseInt(String.valueOf(num.charAt(i)));
            }
            j++;
        }

        bw.write(sum + "\n");
        bw.flush();
    }
}

만약 코드를 보고 이해 안되는 부분이 있다면 댓글 남겨주세요!

혹은 더 좋은 방법이 있다면 알려주세요!

저는 바보라서 조금 비효율적으로 푼 거 같습니다..ㅎㅎ;;

 

이번 글도 읽어주셔서 감사합니다!

728x90
반응형