알고리즘/백준

공부 112일차: 백준 1373번 2진수 8진수 자바 java

김발자~ 2022. 11. 19. 21:26
반응형

1373 2진수 8진수

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

 

1373번: 2진수 8진수

첫째 줄에 2진수가 주어진다. 주어지는 수의 길이는 1,000,000을 넘지 않는다.

www.acmicpc.net

 

 

 


백준 1373번 문제 2진수 8진수


문제


 

 

 

 


과정 생각해보기 & 오답


 

우선 2진수를 8진수로 변환하는 방법에 대해 알아야 한다

위의 그림에서 표시한 것처럼, 2진수를 뒤에서부터 3개씩 나눈 뒤, 자리수에 따라 2^2, 2^1, 2^0과 곱하면 된다

000이 세번 연속되어 나오면 자리에 0을 채워준다(생략하지 않음)

 

 

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main {
 
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String binary = br.readLine();
        int len = binary.length();
        
        String[][] arr = new String[(len/3)+1][3]; //3으로 나누어 떨어지지 않을 수 있으므로 1이 더 
        
        int j = 0;
        int k = 0;
        for(int i = len-1; i >= 0; i--) {    //뒤에서부터 3개씩 끊어야 하므로 뒤부터 반복문을 돌린다
            arr[j][k] = binary.charAt(i)+"";
            k++;
            
            if(k == 3) {
                j++;    //다음[!][] 배열로 넘어간다
                k = 0;
            }
        }
        
        //디버깅
        //System.out.println(Arrays.deepToString(arr));
        
        int sum = 0;
        String octal = "";    // 0이 나와도 빈공간으로 채워야 하므로 문자열로 선언
        for(int i = len/3; i >= 0; i--) {
            sum = 0;
            for(int idx = 0; idx < 3; idx++) {
                String ch = arr[i][idx];
                if(ch == null) {
                    continue;
                }
                if(ch.equals("1")) {
                    sum += (int)Math.pow(2, idx);    //1이면 2^idx를 더한다
                }else {
                    sum += 0;    //0이나 null이면 0을 더한다
                }
                //디버깅 System.out.println(sum);
            }
            octal += sum;
        }
 
        System.out.println(octal);
    }
 
}
// 메모리 초과
cs

주석에 자세하게 설명을 적었다

내가 짜면서도 불안불안하긴 했지만.. 메모리초과가 떴다

 

 

 


정답 인정 코드


 

https://dundung.tistory.com/26

이 블로그를 참고한 코드

 

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
28
29
30
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));
        StringBuilder sb = new StringBuilder();
        
        String binary = br.readLine();
        int len = binary.length();
        
        // 정수char - '0' = 정수
        if(len%3 == 2) { // 3개씩 끊고 2개 남음
            sb.append((binary.charAt(0)-'0')*2 + (binary.charAt(1)-'0'));
        } else if(len%3 == 1) { // 3개씩 끊고 1개 남음
            sb.append(binary.charAt(0)-'0');
        }
        
        //3개씩 끊기는 수
        for(int i = len%3; i < len; i+=3) {
            sb.append((binary.charAt(i)-'0')*4+(binary.charAt(i+1)-'0')*2+(binary.charAt(i+2)-'0')*1);
        }
        
        System.out.println(sb);
    }
 
}
 
cs

 

나 역시 StringBuilder로 붙이는 것까진 생각했지만,

3개씩 끊는 걸 어떻게 해야할지 모르겠어서 위처럼 삽질했던 건데 생각보다 엄청 간단했다

맨날 몫만 보고 나머지는 생각 못해서 빙빙 돌아가는 것 같다

 

 

 


비록 메모리 초과가 뜨긴 했지만 푸는 데 재미가 있었다

반응형