[백준 문제 풀이] 11005번 진법 변환 2

Junu Kim·2025년 7월 5일
0
post-thumbnail

[11005] 진법 변환 2

난이도: ★★★☆☆ • solved on: 2025-07-05


문제 요약

  • 문제 유형: 수학, 구현, 진법 변환
  • 요구사항: 10진법 수 N을 B진법으로 변환하여 출력해야 한다. (B는 2~36)

사용 개념

  1. 자료구조

    • StringBuilder (문자열 뒤집기/결과 누적)
    • 배열/char[] (직접 변환 구현시 사용)
  2. 알고리즘/기법

    • 진법 변환
    • 나머지 연산과 몫 연산 반복
    • 내장 라이브러리 활용
  3. 핵심 키워드

    • 진법 변환, 내장 함수, 수학적 반복

풀이 아이디어 및 코드

방법 1 : Java 내장 진법 변환 함수 활용

  1. 문제 분해
    • Java의 Integer.toString(int, int) 메서드로 바로 진법 변환 가능
    • 대문자 출력을 위해 .toUpperCase() 사용
  2. 핵심 로직 흐름
    입력 → Integer.toString(N, B) → 대문자 변환 → 출력
  3. 예외 처리
    • 없음 (내장 함수가 범위 처리)
import java.util.*;
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = br.readLine().split(" ");
        int target = Integer.parseInt(arr[0]);
        int n = Integer.parseInt(arr[1]);
        System.out.print(Integer.toString(target, n).toUpperCase());
    }
}

방법 2 : 직접 구현 (나눗셈 + 나머지 연산 반복)

  1. 문제 분해
  • 몫이 0이 될 때까지 N을 B로 나눈 나머지를 차례로 저장
  • 10~35는 알파벳(A~Z)로 매핑
  • 마지막에 역순 출력
  1. 핵심 로직 흐름
    while (N > 0) {
        나머지 = N % B;
        결과.append(문자로 변환(나머지));
        N = N / B;
    }
    결과를 뒤집어서 출력
  2. 예외 처리
    • N=0일 때는 "0" 출력
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] arr = br.readLine().split(" ");
        int N = Integer.parseInt(arr[0]);
        int B = Integer.parseInt(arr[1]);

        if (N == 0) {
            System.out.print("0");
            return;
        }

        StringBuilder sb = new StringBuilder();
        while (N > 0) {
            int rem = N % B;
            if (rem < 10) sb.append((char) (rem + '0'));
            else sb.append((char) (rem - 10 + 'A'));
            N /= B;
        }
        System.out.print(sb.reverse().toString());
    }
}

시간·공간 복잡도

방법 1

  • 시간 복잡도: O(log₍B₎N) (내장 함수)
  • 공간 복잡도: O(1) (출력 문자열 제외)

방법 2

  • 시간 복잡도: O(log₍B₎N)
  • 공간 복잡도: O(log₍B₎N) (StringBuilder)

어려웠던 점

  • 진법 변환을 직접 구현할 때 10 이상에 대한 알파벳 매핑이 생소해서 다루기 어려웠다.
  • 입력이 0일 때 처리를 처음에는 누락해서 에러가 발생했다.

배운 점 및 팁

  • Integer.toString(num, radix) 한 줄로 다양한 진법 변환 가능하기에 출력 형식만 주의하면 된다.
  • 직접 구현 시에는 결과를 뒤집는 과정과 알파벳 매핑 로직에 익숙해질 필요가 있다. (연습이 더 필요할 것 같다)

참고 및 링크


추가 연습 문제

  • 비슷한 유형 (GPT 추천) :

  • 확장 문제 (GPT 추천) :

    • (심화) 실수형 진법 변환 구현
    • (심화) 문자열로 표현된 임의의 큰 수의 진법 변환 (BigInteger 사용)
profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글