[BOJ] #1212 - 8진수 2진수

👻 8진수 2진수

👉🏻 문제 보러가기 👈🏻


🌱 문제

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

  • 시간 제한 : 1초
  • 메모리 제한 : 256 MB

🌱 입력

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


🌱 출력

첫째 줄에 주어진 수를 2진수로 변환하여 출력한다. 수가 0인 경우를 제외하고는 반드시 1로 시작해야 한다.


🌱 예제


🪐 입출력 1

  • 입력
    314
    
  • 출력
    11001100
    

👻 풀이

#include <iostream>
#include <list>
#include <string>
using namespace std;
int main()
{
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    // 8진수 2진수
    string o;
    list<long long> d;
    cin >> o;
    for (int i = o.size() - 1; i >= 0; i--)
    {
        int n = o[i] - '0';
        while (true)
        {
            d.push_front(n % 2);
            n /= 2;
            if (n <= 1)
            {
                d.push_front(n);
                break;
            }
        }
        if (o[i] - '0' <= 3) d.push_front(0);
    }
    while (d.size() > 1 && d.front() == 0) d.pop_front();
    for (long long const &i : d)
        cout << i;

    return 0;
}
  • 시간 : 108 ms
  • 메모리 : 33808 KB

👻 글을 마치며

로직 구현하는 데 시간이 꽤 걸린 것 같다. 처음에 10진수를 거쳐 2진수로 변환하는 것을 생각했지만 그렇게 하면 너무 비효율적인 것 같아서 고민하다 구글링을 해봤더니 한 자리씩 이진수 세 자리로 바로 변환할 수 있다는 것을 알았다. 해당 로직을 구현하기 위해 무한 반복 돌리면서 나누기를 하였는데 확실히 8진수의 자릿수 범위가 컸어서 메모리를 꽤나 잡아 먹은 것 같다. 그래도 의미에 가장 맞지 않게 코드를 구현하지 않았나 싶다. 또한 출력 부분에 줄바꿈 ‘\n’을 붙여놔서 계속 틀렸었다. 금방 찾아서 바꾼 부분이었지만 앞으론 조금 더 조심해야 할 것 같다. ㅎㅎ


소스코드 보러가기

Categories:

Updated:

Leave a comment