Java/백준알고리즘

[Java] 백준알고리즘 #2745 진법 변환

Sehyeok20 2023. 10. 5. 18:12
반응형

백준알고리즘 #2745 진법 변환

 

입력받은 수 b진법수 n을 10진법으로 출력하는 문제.

 

위 예제에서 보듯이 ZZZZZ 라는 36진법 수가 있다고 하면 이를 10진수로 바꾸는 과정은 다음과 같다.

먼저 Z라는 수는 36진법에서 35번째 수이다.

5번째 Z : 35 x 1 = 35

4번째 Z : 35 x 36 = 1,260

3번째 Z : 35 x 36^2 = 45,360

2번째 Z : 35 x 36^3 = 1,632,960

1번째 Z : 35 x 36^4 = 58,786,560

이를 모두 더하면 60,466,175 라는 값이 나오게 된다.

 

이를 공식화하게 되면 

n번째 수 : 해당수 x 1

n-1번째 수 : 해당수 x 진법

n-2번째 수 : 해당수 x 진법^2

...

이 될 것이다.

이를 반복문으로 나타내면 다음과 같다

int tmp = 1;
for (int i = n.length() - 1; i >= 0; i--) {
    char c = n.charAt(i);
    if (c >= 'A' && c <= 'Z') {
        result += (c - 55) * tmp;
    } else {
        result += (c - 48) * tmp;
    }
    tmp *= b;
}

 

  1. 곱셈을 위한 변수 tmp를 만들어 1로 초기화한다.
  2. length()함수를 이용해 주어진 문자열의 길이를 반환받아 0이 될때까지 반복하는 for문을 작성한다.
  3. 반복문을 돌면서 주어진 문자열의 뒷부분부터 하나씩 잘라내어 이 값을 비교한다.
  4. 만약 알파벳 범위 안의 문자라면 55를 빼고(아스키코드에서 A는 65. 10이 A가 되므로 65 - 10 = 55)
    이 값을 tmp와 곱한다.
  5. 알파벳이 아니라면 48을 빼고(아스키코드에서 0은 48) 이 값을 tmp와 곱한다.
  6. tmp에 입력받은 진법 b 를 곱한다. 

 

전체 코드는 다음과 같다.

 

import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        String n = sc.next();
        int b = sc.nextInt();
        int tmp = 1;
        int result = 0;
        for (int i = n.length() - 1; i >= 0; i--) {
            char c = n.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                result += (c - 55) * tmp;
            } else {
                result += (c - 48) * tmp;
            }
            tmp *= b;
        }
        System.out.println(result);

        sc.close();
    }
}
반응형