728x90
문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
8진수가 주어졌을 때, 2진수로 변환하여 출력하는 프로그램을 작성해 보세요.
코드
첫 번째 줄에 8진수가 주어진다.
- 1 <= 주어지는 수의 길이 <= 100,000
입력으로 주어지는 수는 매우 클 수 있기 때문에 Integer.parseInt() 메서드와 같은 일반적인 방식으로는 풀 수 없다. 가장 단순한 풀이 방법은 BigInteger를 사용하는 방법이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String octal = br.readLine();
// 입력받은 문자열을 Biginteger 타입의 10진수로 변환하여 저장
BigInteger decimal = new BigInteger(octal, 8);
// 10진수를 2진수로 변환
String binary = decimal.toString(2);
System.out.println(binary);
}
}
하지만, 이는 문제가 의도하는 풀이가 아니라 판단하여 다른 방식으로 풀고자 고민했다.
한 자릿수의 8진수를 2진수로 변환할 수 있는 방법에는 다음 8가지 경우의 수가 존재한다.
- 0 -> 000
- 1 -> 001
- 2 -> 010
- 3 -> 011
- 4 -> 100
- 5 -> 101
- 6 -> 110
- 7 -> 111
이를 배열로 구성하여 8진수를 순회하여 각 자릿수마다 해당하는 2진수를 문자열로 변환하여 덧붙이는 방식이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String octal = br.readLine();
// 8진수를 2진수로 변환
String binary = octalToBinary(octal);
System.out.println(binary);
}
// 8진수를 2진수로 변환하는 메서드
private static String octalToBinary(String octal) {
StringBuilder sb = new StringBuilder();
// 8진수에 따라 매칭되는 2진수 배열
String[] octalValue = {"000", "001", "010", "011", "100", "101", "110", "111"};
// 8진수 문자열 순회
for (int i = 0; i < octal.length(); i++) {
// 각 자리수를 정수로 변환
int digit = octal.charAt(i) - '0';
// 2진수를 담은 배열을 StringBuilder에 추가
sb.append(octalValue[digit]);
}
int idx = 0;
// 첫 번째 자리 수가 0인 경우 1이 등장할 때까지 인덱스 증가
while (sb.charAt(idx) == '0') {
idx++;
}
// 1로 시작하는 부분문자열 반환
return sb.substring(idx);
}
}
- 2진수로 변환한 값이 0인 경우를 제외하고 반드시 1로 시작해야 하기 때문에 부분문자열을 반환해야 한다.
728x90