본문 바로가기
백준 문제 풀이/일반 수학 1

(#2745 Java) 진법 변환

by _비니_ 2024. 2. 26.

 

문제 이해

 

나는 아직도 진법 계산을 정확히 이해하고 있지 못 한 것 같다.. 한 번 제대로 이해할 필요가 있어보인다..

 

일단 어떤 진수든 10진수로 바꾸는 방법은 동일하다.

( 각 자리의 10진수 숫자 * 진수의 각 자리수 제곱을 모두 더한 값 : 2진수 1011이면 >> 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0 = 9 )

 

내가 아직도 헷갈리고 있는 부분은 ASCII 코드의 값과 정수의 관계이다. 

 

<문자를 숫자로 변환하는 방법>

숫자를 그대로 출력할 때는 - '0'를 하고 저장해줘야 한다.

WHY?? 
'0'의 ASCII 코드 값은 48이며, '1'은 49, '2'는 50, ..., '9'는 57이다.
따라서 숫자 문자를 정수로 변환하려면 해당 문자의 ASCII 코드에서 '0'의 ASCII 코드 값을 빼주면 된다.
'5'의 ASCII 코드 값은 53이고, '0'의 ASCII 코드 값은 48이다. 따라서 '5' - '0'은 53 - 48로 계산되어 5가 되는 것이다.이렇게 하면 문자 '5'를 정수 5로 변환할 수 있습니다.
따라서 '0'을 빼는 것은 해당 문자를 숫자로 변환하는 간단한 방법 중 하나이므로 기억하고 가는 것이 좋다~~!!!

만약 A ~ Z 의 숫자가 들어왔다면 -55를 하고 저장해줘야 한다.

WHY??  
'A'부터 'Z'까지의 알파벳 대문자를 10부터 35까지의 숫자로 매핑해야 하는데,
ASCII 코드에서 'A'는 65이므로, 'A'를 10으로 매핑하려면 55를 빼주어야 하기 때문이다. 이를 이해해야 한다!!

 

 

그럼 이를 바탕으로 코드를 작성해보자.

 

문제 해결

 

우선 N과 B를 입력받는 코드를 작성해준다.

Scanner in = new Scanner(System.in);

String N = in.next();
int B = in.nextInt();

 

 

그리고 최종적으로 결과를 담을 result 변수와, 10진수 변환하는 계산에 필요한 지수 변수, 10진수로 변환한 수를 저장할 변수를 각각 선언하고 초기화해준다. 

long result = 0;
int exponent = 0; //지수
int num = 0; //10진수로 변환한 수를 저장할 변수

 

 

'문제 이해' 파트에서 자세하게 설명했던 부분을 코드로 작성한 것이다.

for(int i = N.length()-1; i >= 0; i--) { //문자 끝에서부터 계산
    char ch = N.charAt(i);
    if(ch>='0' && ch<='9')  //0~9 사이이면
        num = ch -'0'; //숫자 그대로 출력 : '0'을 빼줌 (문자 -> 숫자)
    else //A~Z이면
        num = ch - 55; //숫자로 변경해 저장 ('A'는 65, 'A'를 10으로 매핑하기 위해 -55)
    result += num * Math.pow(B, exponent++);
}

 

그리고 result를 출력해주면 끄읏~!

 

최종 코드

 

import java.util.Scanner;

public class NumeralSystemTransformation {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        String N = in.next();
        int B = in.nextInt();

        long result = 0;
        int exponent = 0; //지수
        int num = 0; //10진수로 변환한 수를 저장할 변수

        for(int i = N.length()-1; i >= 0; i--) { //문자 끝에서부터 계산
            char ch = N.charAt(i);
            if(ch>='0' && ch<='9')  //0~9 사이이면
                num = ch -'0'; //숫자 그대로 출력 : '0'을 빼줌 (문자 -> 숫자)
            else //A~Z이면
                num = ch - 55; //숫자로 변경해 저장 ('A'는 65, 'A'를 10으로 매핑하기 위해 -55)
            result += num * Math.pow(B, exponent++);
        }

        System.out.println(result);
    }
}
반응형