[백준] 1373. 2진수 8진수

1 분 소요

문제 링크

[백준] 1373. 2진수 8진수


풀이 과정

2진수 길이가 1,000,000까지 가능하므로, 이를 통해 표현되는 10진수 정수 값은 $2^{999999}$까지 가능하므로, int, long 범위를 훨씬 넘어갑니다. 따라서, 10진수로 변환하는 과정은 오버플로우를 발생시키게 됩니다.


2진수를 16진수로 바꿔줄 때, 네 비트씩 묶어 계산하는 방법이 있습니다. 예를 들어, 위의 2진수 “11001100” 은 네 비트씩 묶어 계산된 값을 이어 붙여 “CC”로 변환할 수 있습니다.


위 같은 방법으로 세 비트씩 묶어 계산된 값을 이어 붙이면 8진수로도 변환할 수 있습니다.


if (len % 3 == 1) {
    answer.append(bin[0]);
} else if (len % 3 == 2) {
    answer.append(ctoi(bin[0]) * 2 + ctoi(bin[1]));
}

뒤에서부터 세 비트씩 묶었을 때, 맨 앞 그룹에 비트가 한 개 혹은 두 개 존재하는 경우의 예외 처리입니다.

  • 한 개만 존재하는 경우, 그 값을 그대로 이어 붙인다.
  • 두 개 존재하는 경우, 첫 째 자리에 2를 곱하고 둘 째 자리를 더한 값을 이어 붙인다.


for (int i = len % 3; i < len; i += 3) {
    answer.append(ctoi(bin[i]) * 4 + ctoi(bin[i + 1]) * 2 + ctoi(bin[i + 2]));
}

이제 예외가 발생하지 않은 부분을 시작으로, 모든 그룹들을 10진수로 변환해 이어 붙입니다.


코드

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        char[] bin = sc.nextLine().toCharArray();
        int len = bin.length;
        StringBuilder answer = new StringBuilder();

        if (len % 3 == 1) {
            answer.append(bin[0]);
        } else if (len % 3 == 2) {
            answer.append(ctoi(bin[0]) * 2 + ctoi(bin[1]));
        }

        for (int i = len % 3; i < len; i += 3) {
            answer.append(ctoi(bin[i]) * 4 + ctoi(bin[i + 1]) * 2 + ctoi(bin[i + 2]));
        }

        System.out.println(answer);
    }

    static int ctoi(char c) { return c - '0'; }
}

카테고리:

업데이트:

댓글남기기