https://www.acmicpc.net/problem/1212
코드 :
package baekjoon.lecture.basic.math.prac1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class N1212_OctalBinary {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String num = br.readLine();
StringBuilder sb = new StringBuilder();
/*
* 8진수 숫자 1개 = 2진수 숫자 세 자리로 나타낼 수 있다.
* 차례로 append 해주기
*/
int[] arr = new int[3];
//첫 문자 처리, 맨 앞자리 0들 없애기
int firstCh = num.charAt(0) - '0';
//첫 문자 0이면 0반환하기 위함
if(firstCh == 0){
sb.append(0);
}
if(firstCh / 4 > 0){
firstCh %= 4;
arr[0] = 1;
}
if(firstCh / 2 > 0){
firstCh %= 2;
arr[1] = 1;
}
arr[2] = firstCh;
//flag로 첫 0인지 확인
boolean isFirst = true;
for (int i = 0; i < 3; i++) {
if(arr[i] == 1){
isFirst = false;
sb.append(1);
}
if(!isFirst && arr[i] != 1){
sb.append(0);
}
}
//첫 문자를 제외한 나머지 처리
for(int i=1; i<num.length(); i++){
int temp = num.charAt(i) - '0'; //문자변환
//100의 자리 : 4로 나눈 몫이 0이상(1)이면 1 아니면 0 append
if(temp / 4 > 0){
sb.append(1);
temp %= 4;
} else {
sb.append(0);
}
//10의 자리 : 2로 나눈 몫이 0이상(1)이면 1 아니면 0 append
if(temp / 2 > 0){
sb.append(1);
temp %= 2;
} else {
sb.append(0);
}
//1의 자리
sb.append(temp);
}
System.out.println(sb);
}
}
8진수 한 자리를 2진수 3자리로 끊어서 나타낼 수 있다는 걸 알면 풀 수 있다. 8진수의 길이가 상당해서, 문자열로 처리해야 한다.
어떻게 짤지 몰라서 그냥 절차적으로 쭉 짜버렸는데, 궁금해서 구글링해보니, 아래 블로그님처럼 이진수가 세 자리씩 끊어서 등장하기 때문에, 배열에 8가지 경우를 열거하거나, 메서드로 만들어서 푼 경우가 많았다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 2089번 - -2진수 (Java 8) (0) | 2022.03.19 |
---|---|
백준 11005번 - 진법 변환 2(Java 8) (0) | 2022.03.18 |
백준 1373번 - 2진수 8진수 (Java 8) (0) | 2022.03.16 |
백준 17087번 - 숨바꼭질 6 (Java 8) (0) | 2022.03.16 |
백준 9613번 - GCD합 (Java 8) (0) | 2022.03.16 |
댓글