본문 바로가기

Algorithm

백준 1373 2진수 8진수 & 백준 1212 8진수 2진수 Java

주어진 2진수를 8진수로 바꾸면 되는 문제이다.

간단해보이는 문제이지만 정답률이 37퍼센트이다.

 

내 생각에 37퍼센트인 이유는

문제를 보고 반 이상의 사람들은 2진수를 10진수로 바꾼다음에 8진수로 변환했을 것이다.

Integer메소드를 활용해서 말이다.

나 또한 처음에 그렇게 풀었는데 결과는 시간초과였다..

 

항상 배워도배워도 까먹는 2진수를 8진수로 변환하는 법을 다시 한번 정리한다.

110101 이라는 이진수가 있을 때

세 자리씩 끊어서 10진수로 변환하면 8진수가 된다.

110/101

110 -> 6

101 -> 5

=>65

 

이런 방법으로 2진수를 바로 8진수로 바꿔주면 맞췄습니다가 뜬다.

하지만 이것을 코드로 옮기는 것도 쉽지만은 않다.

10101인 경우

10/101로 끊어지게 되고 세 자리가 아닌 경우를 처리해줘야 하기 때문이다.

코드를 보며 이해해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String [] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        int n = s.length();
        if (n%3 == 1) { //세 자리씩 끊었을 때 맨 앞에 한 자리만 남는경우
            System.out.print(s.charAt(0));
        } else if (n%3 == 2) { //두 자리만 남는경우
            System.out.print((s.charAt(0)-'0')*2 + (s.charAt(1)-'0'));
        }
        //나머지 경우
        for (int i=n%3; i<n; i+=3) { 
            System.out.print((s.charAt(i)-'0')*4 + (s.charAt(i+1)-'0')*2 + (s.charAt(i+2)-'0'));
        }
    }
 

 

2진수 8진수와 반대인 문제 8진수 2진수 이다.

 

처음에 봤던 문제가 2진수를 8진수로 바꾼다면 이 문제는 8진수를 2진수로 바꾸는 문제이다.

방식은 똑같다. 반대로 251이라는 8진수가 있으면

한자리씩 2진수로 변환해주면 된다.

10/101/001

 2   5     1

 

하지만 이문제가 위에 문제보다 더 어렵다.

이진수로 변환한 결과가 1인경우엔

3자리를 맞추기 위해 앞에 00을 붙여서 001로 만들어줘야하고

맨앞자리가 3자리가 아닐 경우 역시 처리해줘야한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
         String[] eight = {"000","001","010","011","100","101","110","111"};
            String s = scan.nextLine();
            boolean start = true;
            if (s.length() == 1 && s.substring(01).equals("0")) { //입력받은 수가 0인 경우
                System.out.print(0);
            }
            for (int i=0; i<s.length(); i++) {
                int n = Integer.parseInt(s.substring(i,i+1)); 
                if (start == true && n < 4) { //첫번째 자리수 && 3자리가 아닌 2진수 일때
                    if (n == 0) {
                        continue;
                    } else if (n == 1) { 
                        System.out.print("1");
                    } else if (n == 2) {
                        System.out.print("10");
                    } else if (n == 3) {
                        System.out.print("11");
                    }
                    start = false;
                } else {
                    System.out.print(eight[n]);
                    start = false;
                }
            }
        }
 
 

1 ~ 7 을 세자리의 이진수로 바꾼 값을 배열에 인덱스에 맞게 넣어줌으로써 앞자리를 제외한 세자리 처리가

간단하게 해결됐다. 앞자리가 0일 경우의수가 3가지 밖에 없으므로 if문으로 따로 쳐리해준다.

 

코드로 볼 때는 쉬워보이지만 막상 생각하기는 정말 어렵다.ㅠ

'Algorithm' 카테고리의 다른 글

백준 1978 소수 찾기 Java  (0) 2019.04.16
백준 2089 -2진수 Java  (0) 2019.04.16
백준 2745 진법 변환 Java  (0) 2019.04.15
백준 11005 진법 변환 2 Java  (0) 2019.04.15
백준 2609 최대공약수와 최소공배수 Java  (0) 2019.04.15