<알고리즘 문제풀이&연습>/[C++] 백준, 프로그래머스 등등

[백준 1212] 8진수 2진수

BlockDMask 2017. 11. 28. 20:05
반응형
  • 안녕하세요. BlockDMask 입니다. 

  • 오늘은 8진수를 2진수로 바꾸는 문제를 풀어보았습니다.

0. 제목

  • 백준 1212 8진수 2진수

  • BOJ 1212 Oct to Binary

  • C/C++ 8진수를 2진수로

1. 문제 설명

  • 8진수가 주어졌을때, 2진수로 변환하는 프로그램을 작성하시오.

  • 첫째 줄에 8진주가 주어집니다.
    수의 "길이"는 333,334를 넘지 않습니다.
    첫째 줄에 주어진 수를 2진수로 변환하여 출력합니다.
    수가 0인 경우를 제외하고는 반드시 1로 시작해야 합니다.

  • 입력) 0

  • 출력) 0

  • 입력) 362

  • 출력) 11110010

2. 풀이 과정

  • 두가지 방법으로 문제를 풀었습니다.

  • a. 8진수 한자리를 나누고, 나눈 몫과 나머지를 통해서 2진수 세자리로 변환하는 방식.

  • b. 8진수 한자리를 미리 저장해둔 2진수 세자리로 변환하는 방식.
    (8진수 맨 첫째 수는 2진수 한,두,세자리로 변환)

  • a방법으로 풀고, 걸린 시간이 커서 고민하다가  b방법을 생각하게 되었습니다.

  • 8진수에서 2진수로 바꿀때 경우의 수 (0~7)가 8가지 밖에 없으므로 가능한 방법이라 생각합니다.


3. 소스 코드


a. 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
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
//https://www.acmicpc.net/problem/1212
//BOJ_1212_octToBinary
 
#include<iostream>
#include<cstdio>
 
#define MAX_LEN 3
using namespace std;
 
class change{
private:
    string str; //8진수를 담을 문자열
    int len;    //문자열의 길이
public:
    void setStr();
    void callSolution();
    void solution(int num, bool first);
    void printFirstNum(int * arr); //8진수->2진수 첫번째 수를 출력
    void printNum(int * arr) const//8진수->2진수 나머지 수 출력
};
 
void change::printFirstNum(int * arr){
    bool check = false;
 
    for(int i=0; i<MAX_LEN; i++){
        if(check){  //1이 나온 다음부터 0이든 1이든 출력
            printf("%d", arr[i]);
            continue;
        }else if(arr[i] == 1){  //첫번째 1일때 check를 true로 바꾸고 출력
            check = true;
            printf("%d", arr[i]);
        }
    }
}
 
//8진수->2진수 나머지 수 출력
void change::printNum(int * arr) const{
    for(int i=0; i<MAX_LEN; i++){
        printf("%d", arr[i]);
    }
}
 
void change::setStr(){
    cin >> str;
    len = static_cast<int>(str.size());
}
 
void change::callSolution(){
    this->solution(str[0]-'0'true);     //맨 처음 수
    for(int i=1; i<len ;i++){
        this->solution(str[i]-'0'false);
    }
}
 
void change::solution(int num, bool first){
    //맨 처음에 0이 들어온 경우 예외처리
    if(first && num==0){ printf("%d"0); return; }
 
    int arr[MAX_LEN] = {0}; //2진수로 바꾼 수를 담을 배열
    int idx = MAX_LEN-1;    //배열의 index
 
    while(num>0){   //oct -> binary
        arr[idx--= num%2;
        num/=2;
    }
 
    if(first) {
        printFirstNum(arr);
    }else {
        printNum(arr);
    }
}
 
int main(void){
    change oct;
    oct.setStr();
    oct.callSolution();
    return 0;
}
cs


b. 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//https://www.acmicpc.net/problem/1212
//BOJ_1212_octToBinary
 
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
 
class change{
private:
    string str;
    int len;
    string str1[8= {"0""1""10""11""110""101""110""111"};
    string str2[8= {"000""001""010""011""100""101""110""111"};
public:
    void setStr(){
        cin >> str;
        len = static_cast<int>(str.size());
    }
    void callSolution(){
        this->printFirstNum(str[0]-'0');     //8진수 맨 처음 수
 
        for(int i=1; i<len ;i++){
            this->printNum(str[i]-'0');
        }
    }
    void printFirstNum(int num) const{
        cout << str1[num];
    }
    void printNum(int num) const{
        cout << str2[num];
    }
};
 
int main(void){
    change oct;
    oct.setStr();
    oct.callSolution();
    return 0;
}
cs

4. 인증


a. 8진수 한자리를 나누고, 나눈 몫과 나머지를 통해서 2진수 세자리로 변환하는 방식.


b. 8진수 한자리를 미리 저장해둔 2진수 세자리로 변환하는 방식.


- 문제출처 :https://www.acmicpc.net/problem/1212

감사합니다.

반응형