시뮬레이션 문제였다.
구현 방법을 떠올리는데 크게 어렵진 않았지만, 사소한 오류를 고치는 과정이 꽤 걸렸다.
또한, 코드도 깔끔하지 않다. 중복된 코드도 있고 예외처리를 위해 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;
}
'Problem Solving > 백준' 카테고리의 다른 글
[BOJ 백준] 12851번 : 숨바꼭질2 (0) | 2020.09.21 |
---|---|
[BOJ 백준] 1697번 : 숨바꼭질 (0) | 2020.09.21 |
[BOJ 백준] 17479번 : 정식당 (0) | 2020.09.10 |
[BOJ 백준] 10836번 : 여왕벌 (0) | 2020.08.31 |
[BOJ 백준] 18430번 - 무기공학 (0) | 2020.07.08 |