1 minute read

백준 1212번: 8진수 2진수

문제:

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

입력:

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

풀이:

  • 이 문제를 처음 풀 때 각 자리수마다 4보다 클 때 2보다 끌 때 이런식으로 복잡하게 연산을 하여 풀어서 맞긴 하였으나 뭔가 코드가 너무 난잡하여 다른 분들은 어떻게 풀었나 찾아보니 훨씬 쉬운 방법을 공유하겠다. 풀이법의 출처는 쿠케캬캬 개발 기록이며 링크를 타고가면 이 문제에 관한 설명을 볼 수 있다.
  • 이 문제는 #1373: 2진수 8진수의 반대 되는 문제라고 생각하면 된다. 따라서 문제 풀이 방식도 다르다. 우선 배열에 0부터 7까지의 수를 이진수로 나타낸 값을 저장해준다. 해당 인덱스의 값에 맞는 이진수 값을 넣어준다. 그 이후에 입력 받은 숫자를 앞자리부터 하나씩 확인하면서 해당 되는 이진수 값을 출력 해준다. 한가지 예외일때는 제일 앞에 있는 숫자인 경우에는 앞에 0을 무시하고 출력하도록 하여야 된다.
  • 아래 표를 보면 알겠지만 쿠케캬캬님의 방식은 사용 메모리와 시간이 반 이하로 줄어든 것을 확인할 수 있다.

문제 풀이 방법에 따른 사용 메모리 및 시간

풀이 방식 메모리(KB) 시간(ms)
쿠케캬캬님의 방식 2756 32
내 방식 6672 76

코드(쿠케캬캬님의 방식):

#include <iostream>

using namespace std;

int main(){
	string s, binary[8]={"000","001","010","011","100","101","110","111"};
	//입력
	getline(cin, s);
	//각 자리의 숫자마다 알맞는 이진수 값 출력
	for(int i = 0; i < s.size(); i++){
		//제일 첫번째 숫자인 경우 앞에 0무시하고 출력하도록
		if(i == 0){
			if(s[i] == '0') cout << "0"; //0만 있는 경우이므로 0만 출력
			else if(s[i] == '1') cout << "1";
			else if(s[i] == '2') cout << "10";
			else if(s[i] == '3') cout << "11";
			else cout<<binary[s[i]-'0'];
		}
		else cout<<binary[s[i]-'0'];
	}
}

코드(내가 풀었던 방법):

#include <iostream>
#include <stack>

using namespace std;

int main(){
	int temp[3] = {0,0,0};
	string s;
	stack<int> answer;
	getline(cin, s);
	//0인 경우 예외 처리
	if(s[0] == '0'){
		cout<< 0;
		return 0;
	}
	for(int i = s.size()-1; i >= 0; i--){
		//2의 승수에 맞게 값 저장 
		if((s[i]-'0')/4){
			temp[0] = 1;
			if((s[i]-'0'-4)/2){
				temp[1] = 1;
				if((s[i]-'0'-4-2)/1) temp[2] = 1;
			}
			else if((s[i]-'0'-4)/1) temp[2] = 1;
		}
		else if((s[i]-'0')/2){
			temp[1] = 1;
			if((s[i]-'0'-2)/1) temp[2] = 1;
		}
		else if((s[i]-'0')/1) temp [2] = 1;
		//temp에 저장된 이진수 값 스택에 저장 
		for(int j = 2; j >= 0; j--){
			if(i==0 && temp[j]==0){
				if(temp[j-1]==1||temp[j-2]==1) answer.push(temp[j]);
				else continue;
			}
			else answer.push(temp[j]);
		}
		//변수 초기화 
		for(int k = 0; k < 3; k++) temp[k] = 0;
	}
  //정답 출력
	while(!answer.empty()){
		cout<<answer.top();
		answer.pop();
	}
}

Leave a comment