728x90

※ 문제


문제 이해하기.

B진법이 무엇인지 알아보자.

 

두 수 A와 B가 주어졌을 때 A를 B로 나눈 나머지값들을 B진법 규칙의 맞게 변환시킨 것이다.숫자 60,466,175와 36로 예를 들면, 60,466,175%36 = 35이다.그리고 60,466,175/36 = 1,679,615(소수점제외)이고, 다시 1,679,615을 36으로 나눈 나머지 값을 구하면 35가 나온다.

반복하면 마지막 숫자는 35가 나와 총 나머지값은 35,35,35,35,35이고, 이를 B진법으로 변환하면 ZZZZZ이 되는 것이다.

백준문제(https://www.acmicpc.net/problem/11005)이 문제의 반대로 푸는 문제인 것이다.


1. 성공

 1) 설계

10진법 → B진법으로 이 아닌 B진법 → 10진법 이기 때문에 거꾸로 연산해야한다.

예제 입력으로 예시 들면 

// 예제 입력
ZZZZZ 36

 

연산 과정은 다음과 같다.

 

① 35 (* Z = 35)

② 36*35 = 1260
    1260+35 = 1295

③ 36*1295 = 46620
    46620+35 = 46655

④ 36*46655 = 1679580
    1679580+35 = 1679615

⑤ 36*1679615 = 60466140
    60466140+35 = 60466175

 

답은 60466175이 된다.

이것을 코드로 구현해보자.

 

 2) 코드

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine());

        String[] arr = st.nextToken().split("");
        int N = Integer.parseInt(st.nextToken());

        long result = 0;

        if(!arr[0].matches("[A-Z]")) {
            result = Long.parseLong(arr[0]);
        }

        if(arr[0].matches("[A-Z]")) {
            byte[] bytes = arr[0].getBytes(StandardCharsets.US_ASCII);
            result = bytes[0]-55;
        }

        for(int i=1; i<arr.length; i++) {
            result *= N;

            if(!arr[i].matches("[A-Z]")) {
                result += Long.parseLong(arr[i]);
            }

            if(arr[i].matches("[A-Z]")) {
                byte[] bytes = arr[i].getBytes(StandardCharsets.US_ASCII);
                result += bytes[0] - 55;
            }
        }

        bw.write(result+"");
        bw.flush();
        bw.close();
    }
}

문제의 예제는 모두 통과하였으나 정확도의 이슈가 해결되지 않은 분은 아래 반례로 확인해보기 바랍니다.

※ 반례

입력 : 10201 3

출력 : 100

연산과정 :

① 1


② 3*1 = 3
     3+0 = 3


③ 3*3 = 9
     9+2 = 11


④ 3*11 = 33
     33+0 = 33


⑤ 3*33 = 99
    99+1 = 100

 

728x90
TOP