#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