[백준] 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'; }
}
댓글남기기