백준 1212 : 8진수 2진수

혀니앤·2021년 4월 12일
0

C++ 알고리즘

목록 보기
45/118

★★☆☆☆

오랜만에 문제를 풀어서 그런지..허술하게 풀어서 여러번 도전했다
알고리즘 자체는 어렵지 않았다.

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가량 줄어드는 것을 알 수 있었다.

https://blockdmask.tistory.com/243

profile
일단 시작하기

0개의 댓글