Notice
Recent Posts
Recent Comments
«   2025/07   »
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
Archives
관리 메뉴

일상

[C++] 백준 1212 : 8진수 2진수 본문

programming

[C++] 백준 1212 : 8진수 2진수

Mysteryu 2024. 4. 27. 02:08

풀이 

풀이 과정은 크게 3단계로 나눠서

(1). 문자열로 입력을 받고

(2). 문자열 요소를 int 변환 후 각각의 요소에 대해 2진수를 구한 뒤

(3). 첫번째 수가 1부터 나오게 만들기

로 하였다.

 

먼저 코드를 써보면

 

#include <iostream>
#include <string>

int main() {
    std::string s;
    std::cin >> s;

    int oct_num;
    int binary[3] = { 0 };

    for (int i = 0; i < s.length(); i++) {
        oct_num = (int)(s[i] - 48);
        
        int j = 2;

        while (oct_num != 0) {
            binary[j] = oct_num % 2;
            oct_num /= 2;
            j--;
        }
        while (j >= 0) {
            binary[j] = 0;
            j--;
        }

        for (int k = 0; k < 3; k++) {

       
            if ((i == 0) && (k == 0) && (binary[k] == 0)) 
                continue;
            if ((i == 0) && (k == 1) && (binary[k] == 0) && (binary[0] == 0 ))
                continue;
            else
                std::cout << binary[k];
        }
    }
}

 

여기서 애먹은 단계는 2단계여서 2단계 풀이에 대해서만 좀 더 써 보면,

 

우선 2단계 구현의 경우 첫번째 for문과 두번째 for문 사이에 구현이 되어있다.

oct_num 변수는 int 타입으로 변환 된 문자열 요소이고, 이 변수에 대해서 2진수를 구하는 코드이다.

 

2진수를 구하기 위해서는 oct_num을 2로 계속 나눴을 때 0이 나올때까지 첫번째 while문이 돌아간다. 그 이유는 8진수(10진수)를 2진수로 나타내기 위해서는 oct_num을 2로 나누었을 때 나머지를 가져와야 하기 때문이다.

 

참고 : 2진수를 구하기 위해서는 8, 10, 16진수를 계속 2로 나누면서 몫이 0이 될 때 까지 루프를 돌고, 루프 안에서 2로 나눈 나머지를 저장하면 됨

 

이 때, 8진수는 3비트의 2진수로 나타낼 수 있으므로 루프는 3번을 돌면 되는데, 문제는 oct_num의 초기값이 0에서 4의 값일 경우 최소 0번에서 최대 2번까지만 첫번째 while문이 돌게 된다. 따라서 두번째 while문을 포함하여 3번의 루프를 돌게 만들어준다(int j가 핵심)

 

 

3단계의 경우 마지막 for문인데, 사실 하드코딩을 해서 마음에 들지 않기때문에 다른 사람 방법을 참고해서 이 코드를 다시 한번 작성하든지 해야겠다. 어찌되었든 해결! 

 

 

Comments