구현 문제이다.
- 뱀은 덱 으로 구성된다 -> 머리를 추가해야 할 때도 있고 꼬리를 지워야 할 때도 있기 때문
- 사과는 지도에서 1로 표시되고, 뱀은 2로 표시된다.
- 사과의 좌표를 받을 때에는 1을 빼준값을 지도에 표시한다.
이렇게 세가지만 유념하면 구현하는것은 생각만 하면 풀 수 있다.
#include <bits/stdc++.h>
using namespace std;
// 판 크기
int n;
// 사과 개수
int k;
// 뱀의 방향 변환 횟수 -> X초 후에 'L' 왼쪽, 'D' 오른쪽 으로 머리를 90도 돌림
int l;
int cnt = 0;
int Map[100][100] = { 0, };
int dir = 0;
int idx = 0;
vector<pair<int, char>> turn;
deque<pair<int, int>> snake;
// 동 남 서 북
int dx[] = { 0, 1, 0, -1 };
int dy[] = { 1, 0 ,-1 ,0 };
void solve()
{
while (1)
{
cnt++;
int nx = snake.front().first + dx[dir];
int ny = snake.front().second + dy[dir];
// 뱀이 Map을 벗어나거나, 머리가 몸통에 닿을 경우
if (nx < 0 || nx >= n || ny < 0 || ny >= n || Map[nx][ny] == 2)
break;
// 뱀의 머리가 갈 곳이 빈칸이면 그쪽으로 옮김
else if (Map[nx][ny] == 0)
{
Map[nx][ny] = 2;
Map[snake.back().first][snake.back().second] = 0;
snake.push_front(make_pair(nx, ny));
snake.pop_back();
}
// 뱀의 머리가 사과를 먹었을 경우 사과 자리에 뱀 머리 추가.
else if (Map[nx][ny] == 1)
{
Map[nx][ny] = 2;
snake.push_front(make_pair(nx, ny));
}
if (idx < l && turn[idx].first == cnt)
{
char dir_char = turn[idx].second;
if (dir_char == 'L')
{
dir = (dir + 3) % 4;
}
else if (dir_char == 'D')
{
dir = (dir + 1) % 4;
}
idx++;
}
}
}
int main()
{
cin >> n >> k;
// 사과 자리는 Map에서 1
for (int i = 0; i < k; i++)
{
int x, y;
cin >> x >> y;
Map[x-1][y-1] = 1;
}
cin >> l;
// 머리를 돌리는 좌표를 pair로 저장
for (int i = 0; i < l; i++)
{
int x;
char c;
cin >> x >> c;
turn.push_back(make_pair(x, c));
}
snake.push_back(make_pair(0, 0));
// 뱀이 있음을 표시
Map[0][0] = 2;
solve();
cout << cnt;
return 0;
}
문제를 안풀다가 풀게 되니 감을 잃어서 그런것인지 집중이 잘 안됐었다.
나는 3번때문에 30분은 날려먹은 듯 하다. 이게 그냥 값을 받아서 저장해버리면
문제 예시의 1번과 2번은 공교롭게도 정답이 나온다.
하지만 3번 예시가 계속 틀리게 나오는데 진짜 환장할 뻔했다.
디버그를 하나하나 돌려보고서야 알게되었다.. 문제를 잘 읽자..