728x90

※ 문제


문제 이해하기.

 

간단하다. 입력된 2진수를 8진수로 변환하여 출력하는 것이다.

 


1. 과정

 1) 설계

입력값이 2진수 '11001100'인 경우 자릿수 별로 10진수로 변환했을 때 각각 '128 64 32 16 8 4 2 1'이 된다.

자릿수의 값이 1인 경우만 더하면 계산식은 다음과 같다. '4+8+64+128 = 204' 다시 2진수 '11001100' → 10진수 '204'가 되는 것이다. 여기서 10진수 '204'를 8진수로 변환하는 과정은 다음과 같다. 8진수 '0000'은 자릿수 별로 10진수로 변환했을 때 각각 '512 64 8 1'이다. 204는 512보다 작기 때문에 제외한다. 204/64 = 소숫점 제외하면 3이 되고 64*3 = 192, 204에서 192를 빼면 12가 되고 12를 8로 나누면 1이 된다.(소수점 제외) 남은 수는 4이므로 각각 자릿수별로 합치면 '314'가 된다.

 

 

※ 결론 요약

 ① 2진수를 10진수로 변환 후 8진수로 변환.

 

 2) 코드

① 실패코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        int binaryToDecimal = Integer.parseInt(inputInt, 2);
        String octal = Integer.toOctalString(binaryToDecimal);

        System.out.println(octal);
    }
}
// input : 11001100
// output : 314

 - 문제에서 주어진 반례는 정상적으로 출력되나 제출 시 '런타임에러(NumberFormat)'이 발생하였다. 문제에서 조건을 보니 입력값의 길이가 최대 백만까지 가능한 것이 문제였다.

 

입력 : 10000000000000000000000000000000

출력 : Exception in thread "main" java.lang.NumberFormatException: For input string: "10000000000000000000000000000000"

발생함.

 

② 성공코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

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

        BigInteger bigInteger = new BigInteger(inputInt, 2);

        System.out.println(bigInteger.toString(8));
    }
}

 

 


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

※ 반례

입력 : 10000000000000000000000000000000

출력 : 20000000000

728x90
TOP