본문 바로가기
알고리즘/백준

백준 1212번 - 8진수 2진수 (Java 8)

by latissimus 2022. 3. 17.

https://www.acmicpc.net/problem/1212

 

1212번: 8진수 2진수

첫째 줄에 8진수가 주어진다. 주어지는 수의 길이는 333,334을 넘지 않는다.

www.acmicpc.net

코드 :

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가지 경우를 열거하거나, 메서드로 만들어서 푼 경우가 많았다.

기록나누기 블로그 

댓글