[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’을 붙여놔서 계속 틀렸었다. 금방 찾아서 바꾼 부분이었지만 앞으론 조금 더 조심해야 할 것 같다. ㅎㅎ
Leave a comment