★★☆☆☆
오랜만에 문제를 풀어서 그런지..허술하게 풀어서 여러번 도전했다
알고리즘 자체는 어렵지 않았다.
https://www.acmicpc.net/problem/1212
그림을 넣기도 민망한 수준이긴한데, 입력은 string으로 받고(333,334크기까지 받아야하므로)
맨뒷자리부터 접근하며, 8->2진수 변환과정을 진행한다.
8->2진수 변환의 경우, 2로 계속해서 나누어 앞자리부터 출력해야하므로 stack에 보관한다
bool 변수를 하나 만들어, 출력 과정에서 첫번째 1이 나오면 true가 되도록 설정한다.
#include <iostream>
#include <stack>
#include <string>
using namespace std;
int main() {
string tem;
stack<int> arr;
cin >> tem;
if (tem.length()==1 && tem[0]=='0') {
cout << 0 << "\n";
return 0;
}
for (int i = tem.length()-1; i>=0;i--) {
//cout << "N :: " << tem[i] << " 케이스 시작\n";
int x = tem[i];
int count =0;
while (count<3) {
arr.push(x%2);
//cout << "PUSH :: " << x % 2 << "\n";
x = x / 2;
count++;
}
}
bool Isstart = false;
while (!arr.empty()) {
if (!Isstart && arr.top() == 0);
else {
cout << arr.top();
Isstart = true;
}
arr.pop();
}
return 0;
}
풀면서, 8가지밖에 되지 않는 각각의 경우 때문에 매번 나누는게 비효율적으로 느껴졌다.
(반복적으로 같은 일을 하는데..)
다른 사람의 풀이를 보던 중, 이 생각에 근거해서 코드를 짠 케이스를 보았다.
미리 배열에 0~7까지의 출력값을 넣고, 그대로 출력하는 것이다.
실행시간도 3/1가량 줄어드는 것을 알 수 있었다.