본문 바로가기
Algorithm/BOJ

[BOJ]1212번: 8진수 2진수(java, c++)

by HBGB 2019. 9. 23.

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

 

1212번: 8진수 2진수

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

www.acmicpc.net

 

 

방법1: 8까지의 2진수를 미리 배열에 저장해두고 호출

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
import java.io.*;
 
public class Main {
    public static void main(String[] args) {
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
            String[] arrFirstOct = {"0","1","10","11","100","101","110","111"};
            String[] arrOct = {"000","001","010","011","100","101","110","111"};
            String strOctNum = br.readLine();
            
            sb.append(arrFirstOct[strOctNum.charAt(0- '0']);
 
            int iOctlen = strOctNum.length();
            for (int i = 1; i < iOctlen; i++) {
                sb.append(arrOct[strOctNum.charAt(i) - '0']);
            }
            
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Colored by Color Scripter

 

 

 

방법2: 수 한자리 한자리 모두 계산하여 2진수로 만들기

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
import java.io.*;
import java.util.Stack;
 
public class Main {
    public static void main(String[] args) {
 
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
 
            String strOctNum = br.readLine();
 
            for (int i = 2; i >= 0; i--) {
                if (strOctNum.charAt(0- '0' >= Math.pow(2, i)) {
                    sb.append(oneBinaryUnit(strOctNum.charAt(0- '0', i + 1));
                    break;
                } else if (strOctNum.charAt(0- '0' == 0) {
                    sb.append(0);
                    break;
                }
            }
            
            int iOctlen = strOctNum.length();
            for (int i = 1; i < iOctlen; i++) {
                sb.append(oneBinaryUnit(strOctNum.charAt(i) - '0'3));
            }
            
            System.out.println(sb.toString());
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public static String oneBinaryUnit(int i, int length) {
        String oneBinaryUnit = "";
        Stack<Integer> stack = new Stack<Integer>();
        for (int k = 0; k < length; k++) {
            stack.push(i%2);
            i = i/2;
        }
        
        while(!stack.isEmpty()) {
            oneBinaryUnit += stack.pop();
        }
        return oneBinaryUnit;
    }
}
Colored by Color Scripter

 

c++소스

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
#include <iostream>
 
using namespace std;
 
// 8진수 -> 2진수. 0을 채워서 반환한다.
string octal_to_binary(char octal)
{
    int ot = octal - '0';
    char bin[4= {0,};
    for (int i = 0; i < 3; i++)
    {
        bin[2 - i] = ot % 2 + '0';
        ot /= 2;
    }
    return bin;
}
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    string input;
    cin >> input;
 
    // 첫번째 숫자만 따로 처리. 4 미만일 경우, 미리 만들어둔 배열 출력
    string first[4= { "0""1""10""11" };
    if (input[0< '4')
    {
        cout << first[input[0- '0'];
    }
    // 4 이상일 때 일반 숫자와 같이 출력
    else
    {
        cout << octal_to_binary(input[0]);
 
    }
 
    for (int i = 1; i < input.size(); i++)
    {
        cout << octal_to_binary(input[i]);
    }
 
    return 0;
}
Colored by Color Scripter

 

방법1: 8까지의 2진수를 미리 배열에 저장해두고 호출

방법2: 수 한자리 한자리 모두 계산하여 2진수로 만들기

 

방법1이 방법2보다 메모리는 훨씬! 적게 먹고 시간은 2배 빨랐다.

 

 

 

TIP1

그때그때 수를 계산하는 것보다,

배열의 인덱스 = 수 한자리로 생각하여 배열로 2진수를 호출하는 것이 더 효율적이다. 

 

 

TIP2

맨 앞자리 숫자가 0으로 시작하면 안되므로

첫번째 자리만 다르게 취급해주자.

 

 

 

 

 

 

 

 

댓글