뱀
문제: 뱀 (백준 3190번)
구조 분석
해당 문제는 단순 구현 문제이다. 보드에 사과의 위치를 입력 받고 뱀을 움직이며 조건에 따라 게임을 중단하는 간단한 형태의 문제이나 구현하는데 있어서 생각할 조건이 많고 까다로워 풀이를 할 때 헷갈리지 않게 잘 해야 한다.
풀이 방법
우선 사과 위치를 표기할 보드와 뱀의 위치를 표기할 보드 두개를 생성한다. 이후 뱀을 구현하기 위해 deque를 사용한다.
Deque
를 사용하는 이유는 해당 stl은 push_front, push_back, pop_front, pop_back을 지원하기 때문이다. 이를 활용하면 뱀의 움직임을 더 쉽고 효율적으로 구현할 수 있다.
다음으로 시간별 방향설정을 구현하기 위해 char형 배열을 생성한다. 여기서 굳이 배열을 생성한 이유는 시간을 index로 이용하여 바로 해당 시간의 char가 무엇인지 바로 알 수 있기 때문이다.
마지막으로 방향설정을 하기 위해 dx[4] = {0,1,0,-1}과 dy[4] = {1,0,-1,0}을 전역변수에 생성한다. dx와 dy는 임의로 이름을 붙인 것이고 본인 편한대로 이름을 붙여주면 된다. 여기서 위와 같이 설정한 이유는 인덱스를 이용해 시계방향과 반시계방향을 정할 수 있기 때문이다.
i=0: 오른쪽 진행
i=1: 아래로 진행
i=2: 왼쪽 진행
i=3: 위로 진행
때문에 i를 증가시키면 시계방향 회전 i를 감소시키면 반시계방향 회전한다.
코드
#include <stdio.h>
#include <iostream>
#include <queue>
#include <deque>
using namespace std;
int n, k, l;
int map[101][101];
int snake[101][101];
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};
char swift[10001];
deque<pair<int,int>> S;
int main() {
cin >> n;
cin >> k;
for (int i=0; i<k; i++) {
int r, c;
cin >> r >> c;
map[r][c] = 1;
}
cin >> l;
for (int i=0; i<l; i++) {
int t;
char c;
cin >> t >> c;
swift[t] = c;
}
S.push_back({1,1});
snake[1][1] = 1;
int time = 0;
int dir = 0;
while(true) {
time++;
int nc = S.front().first + dx[dir];
int nr = S.front().second + dy[dir];
if (nc < 1 || nc > n || nr < 1 || nr > n) {
break;
}
S.push_front({nc,nr});
if (swift[time] == 'D') {
dir += 1;
if (dir == 4) dir = 0;
}
else if (swift[time] == 'L') {
dir -= 1;
if (dir == -1) dir = 3;
}
if (map[nc][nr] == 1) {
map[nc][nr] = 0;
}
else {
if (snake[nc][nr] == 1) break;
snake[S.back().first][S.back().second] = 0;
S.pop_back();
}
if (snake[nc][nr] == 1) break;
else snake[nc][nr] = 1;
}
cout << time << "\n";
return 0;
}
정리
해당 문제는 단순 구현 문제였다. 그러나 단순 구현일수록 구현하는게 더 까다롭고 생각할 조건이 많다. 따라서 단순 구현 문제의 경우 문제를 많이 풀면서 자신감을 갖는게 중요하다고 생각한다. 또한 deque stl을 이용하여 여러 문제들을 쉽게 푸는 것을 익혀두면 좋을 것 같다.
댓글남기기