코딩가딩가

[JAVA]BOJ 11005, 진법 변환 2

Noooodle 2024. 7. 13. 17:11

어디서 많이 해본 진법변환 문제.. 보통 2진수, 8진수, 16진수로만 바꿨는데 36진법으로도 바꿔보았다. 사실 방법은 같으니까...

 

1. 진법 배열을 미리 만들고 2. 값을 입력받은 후 나누기 계산을 통해 진법 출력한다. 이때 재귀를 이용한다. 나는 재귀가 좋아..

 

1. 진법 배열 미리 만들기

 0   1   2   3  ...   Y     Z  

[0] [1] [2] [3] ... [34] [35]

이런식으로 미리 저장해둔다. for문을 쓸까 하다가 ..알파벳부터는 또 새로 만들어야 하니까 귀찮아서 아예 초기값으로 줘버렸다.

예를들어 8진법이면 0~7 까지만 사용할거고 실제 출력값은 Bformation[0] ~ [7]이 될거다. ('0' ~ '7')

이렇게 한 이유는 알파벳 때문이다. 숫자 0~9가 아닌 문자 '0'~'9'와 'A'~'Z'를 저장한다.

// 진법 표만들기, 최대 36진법이니까.. 36칸이 필요(0~35)
char[] Bformation = {'0', '1', '2', '3', '4', '5',
                    '6', '7', '8', '9', 'A', 'B',
                    'C', 'D', 'E', 'F', 'G', 'H',
                    'I', 'J', 'K', 'L', 'M', 'N',
                    'O', 'P', 'Q', 'R', 'S', 'T',
                    'U', 'V', 'W', 'X', 'Y', 'Z'};

 

2. 재귀 이용해서 출력하기

B진법으로 만드는 방법은 계속 N을 B로 나누고, 또 그 나눈 몫을 또 나누고.. 나누다가 N이 0이 되면, 여태 계산된 나머지를 반대로 출력하는 것이다.

10으로 예를 들면.. 10 / 2 = 5 ... 0 -> 5 / 2 = 2 ... 1 -> 2 / 2 = 1 ... 0 -> 1 / 2 = 0 ... 1  답: 1010

반대로 출력하기위해.. 예전에는 막 for문을 쓰고, 반대로 저장해서 다시 반대로 출력하고 그랬는데, 굳이 어딘가에 저장할 필요는 없다. 그냥 출력하면 된다.

나머지 인덱스에 맞는 진법표(Bformation)를 출력한다. 10이라면 Bformation[1], Bformation[0], Bformation[1], Bformation[0] 이 순서대로 출력될 것이다.

public static void makeNtoB(int N, int B, char[] Bformation){
    if(N < B){
        System.out.print(Bformation[N % B]);
        return;
    }
    else{
        makeNtoB(N / B, B, Bformation); 
        System.out.print(Bformation[N % B]);
    }
}

 


아래는 전체 코드이다.

import javax.imageio.IIOException;
import java.io.*;
import java.util.StringTokenizer;

public class BOJ11005 {
    public static void makeNtoB(int N, int B, char[] Bformation){
        if(N < B){
            System.out.print(Bformation[N % B]);
            return;
        }
        else{
            makeNtoB(N / B, B, Bformation); 
            System.out.print(Bformation[N % B]);
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N, B, i;
        String str;
        StringTokenizer st;

        str = br.readLine();
        st = new StringTokenizer(str);

        N = Integer.parseInt(st.nextToken());
        B = Integer.parseInt(st.nextToken());

        // 진법 표만들기, 최대 36진법이니까.. 36칸이 필요(0~35)
        char[] Bformation = {'0', '1', '2', '3', '4', '5',
                            '6', '7', '8', '9', 'A', 'B',
                            'C', 'D', 'E', 'F', 'G', 'H',
                            'I', 'J', 'K', 'L', 'M', 'N',
                            'O', 'P', 'Q', 'R', 'S', 'T',
                            'U', 'V', 'W', 'X', 'Y', 'Z'};

        makeNtoB(N, B, Bformation);
    }
}

 

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 3058, 짝수를 찾아라  (0) 2024.07.17
[JAVA]BOJ 11068, 회문인 수  (0) 2024.07.17
[JAVA]BOJ 10448, 유레카 이론  (0) 2024.07.13
[C]BOJ 9095, 1, 2, 3 더하기  (0) 2024.07.12
[C]BOJ 1748, 수 이어 쓰기 1  (0) 2024.07.12