※ 문제
문제 이해하기.
간단하다. 입력된 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
'자기계발 > 백준 문제 풀이' 카테고리의 다른 글
2745 자바 ] 진법 변환(풀이) / B진법 (0) | 2022.10.20 |
---|---|
2609 자바 ] 최대공약수와 최소공배수(풀이) / 유클리드 호제법 (0) | 2022.09.16 |
1918 자바 ] 후위 표기식(풀이) (0) | 2022.09.13 |
17299 자바 ] 오등큰수(풀이) (0) | 2022.09.10 |
17298 자바 ] 오큰수(풀이) (0) | 2022.09.09 |