개발하는 햄팡이

[JAVA][백준 11005] 진법 변환2 본문

Algorithm/Baekjoon

[JAVA][백준 11005] 진법 변환2

hampangee 2024. 6. 10. 02:18

문제

10진법 수 N이 주어진다. 이 수를 B진법으로 바꿔 출력하는 프로그램을 작성하시오.

10진법을 넘어가는 진법은 숫자로 표시할 수 없는 자리가 있다. 이런 경우에는 다음과 같이 알파벳 대문자를 사용한다.

A: 10, B: 11, ..., F: 15, ..., Y: 34, Z: 35

입력

첫째 줄에 N과 B가 주어진다. (2 ≤ B ≤ 36) N은 10억보다 작거나 같은 자연수이다.

출력

첫째 줄에 10진법 수 N을 B진법으로 출력한다.

예제 입력 1

60466175 36

예제 출력 1 복사

ZZZZZ

 


풀이

진법 변환의 전통적인 방법인 반복문로 계속 나누기....그 왜 어렸을 때 흔히 우리가 2진법으로 바꿀때 몫을 가지고 계속 나누는데 더이상 나누어 지지 않을때까지 하는 그 방법을 코드로 옮기는 방법으로 풀려고 한다.

 

최대값이 1,000,000,000 이고 그걸 2진법으로 바꾼다고 해도 연산은 27번 정도(맞나?) 걸리기 때문에 시간 제한으로 걸려있는 0.5초는 충분히 통과할 것 같아서 해당 방법으로 푸는 것에는 문제가 없지만


그 결과를 char 형태로 만드는 부분이 조금 헷갈려서 고민을 좀 했다.

진법 변환 손으로 하는 방법



그래서 일단 char로 바꾸는 방법은 그냥 0부터 9까지는 (바꾸려는 num) + '0'으로 숫자로 저장하고 그 이상을 알파벳 대문자로 저장하는 기본적인 방법으로 풀었다.

 

코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();  // 10진법 수
        int B = sc.nextInt();  // 표현할 진법의 수
        StringBuilder sb = new StringBuilder();

        while (N > 0) {
            int num = N % B; // 나머지 값.
            N /= B; // 그 다음으로 넘어가기

            // num을 진법으로 바꾸어 char 형태로 저장
            if (num < 10) {
                sb.append((char) (num + '0')); // 0-9의 경우 숫자 그대로
            } else {
                sb.append((char) (num - 10 + 'A')); // 10-35의 경우 A-Z로 변환
            }
        }

        // 저장된 sb를 뒤집어 출력
        System.out.println(sb.reverse());
    }
}