Problem Solving/백준

[BOJ 백준] 16113번 : 시그널

돌돌김 2020. 9. 13. 02:46

www.acmicpc.net/problem/16113

 

16113번: 시그널

zxcvber는 외계인을 연구하는 과학자다. 그는 지난 10년간 우주에서 오는 시그널를 연구했지만, 아무런 성과가 없었다. 그러던 어느 날, 갑자기 우주에서 이상한 시그널이 오기 시작했다. zxcvber는 �

www.acmicpc.net

 

시뮬레이션 문제였다. 

 

구현 방법을 떠올리는데 크게 어렵진 않았지만, 사소한 오류를 고치는 과정이 꽤 걸렸다.

 

또한, 코드도 깔끔하지 않다. 중복된 코드도 있고 예외처리를 위해 goto를 사용했다.. 

 

좀 더 깔끔하게 짤 방법이 있을 것이다.

 

 

문제 해결 방법

 

디지털 숫자를 위에서 아래로 읽었을 때 나오는 값을 '#'과 '.' 의 형태의 문자열로 따로 저장해둔다. 

 

예를들어 2라는 숫자를 왼쪽 위에서 시작하여 아래로 내려가며 읽은 값은 "#.####.#.####.#" 가 된다. 

 

이렇게 모든 값을 string zero, one .. nine 까지 저장한 뒤 전체 시그널을 똑같은 방식으로 읽어가며 해당 시그널이 어떤 숫자인지 확인 하는 것이다.

 

숫자 간 구분 & 예외처리

숫자를 구분하는 것은 간단하다. 위에서 아래로 읽어 내려가는데, 맨 윗줄이 '.' 이면 공백이다.

모든 숫자들은 맨 윗줄이 전부 검정색이다. 단, 숫자 4의 경우 다른 숫자들과 달리 맨 윗줄에 빈칸이 하나 있다. 

이 부분을 goto를 사용해 해결했다. 

 

또한 맨 마지막에 숫자가 있는 경우 str을 출력하기 위해 마지막에 한번 더 시그널과 숫자를 비교해서 출력한다

소스코드
#include<bits/stdc++.h>
#define endl "\n"
#define MAX 10
using namespace std;
int n;
string sign;
vector<int>ans;
// 해당 숫자를 위에서 아래로 읽었을 때 나오는 값
string zero = "######...######";
string one = "#####";
string two = "#.####.#.####.#";
string three = "#.#.##.#.######";
string four = "###....#..#####";
string five = "###.##.#.##.###";
string six = "######.#.##.###";
string seven = "#....#....#####";
string eight = "######.#.######";
string nine = "###.##.#.######";
char SIGNAL[5][20000];
int main() {	
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	freopen("input.txt", "r", stdin);
    cin>>n>>sign;
    int len = n/5; // 몇개씩 끊어 읽을 건지
    int idx = 0;
    for(int i=0; i<5; i++){
        for(int j=0; j<len; j++){            
            SIGNAL[i][j] = sign[idx++];
        }
    }

    string str="";
    for(int i=0; i<len; i++){        
        if(SIGNAL[0][i]=='.'){  // 맨 윗줄이 공백인 경우 : 띄어쓰기 칸 이거나 숫자 4
            if(str.compare("###..")==0) goto here; // 숫자 4의 경우, 맨 윗줄이 공백인 칸이 있기 전까지의 str의 모양                       
            else if(str.compare(zero)==0)cout<<'0';
            else if(str.compare(one)==0)cout<<'1';
            else if(str.compare(two)==0) cout<<'2';
            else if(str.compare(three)==0) cout<<'3';
            else if(str.compare(four)==0)cout<<'4';
            else if(str.compare(five)==0)cout<<'5';
            else if(str.compare(six)==0) cout<<'6';
            else if(str.compare(seven)==0)cout<<'7';
            else if(str.compare(eight)==0)cout<<'8';
            else if(str.compare(nine)==0)cout<<'9';         
            //ans.push_back(res);
            str="";
            continue;
        }
        here:
        for(int j=0; j<5; j++){
            str+=SIGNAL[j][i];
        }        
    } 
    // 마지막에 숫자 붙어있는 경우
    if(str.compare(zero)==0)cout<<'0';
    else if(str.compare(one)==0)cout<< '1';
    else if(str.compare(two)==0) cout<<'2';
    else if(str.compare(three)==0) cout<<'3';
    else if(str.compare(four)==0)cout<<'4';
    else if(str.compare(five)==0)cout<<'5';
    else if(str.compare(six)==0) cout<<'6';
    else if(str.compare(seven)==0)cout<<'7';
    else if(str.compare(eight)==0)cout<<'8';
    else if(str.compare(nine)==0)cout<<'9';         
  return 0;
}