[백준] 3190 뱀
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
구현 문제 연습을 위해 5달전에 풀었던 뱀 문제를 다시 풀었다.
어떻게 문제를 풀어야할지는 쉽게 감이 잡히지만 입력값도 많고 변수의 양이 많아 코드를 작성하는데 시간이 좀 오래걸렸다. 1시간 10분정도 걸린 것 같다. 코드 구현은 여러 조건을 고려해야 했다. 고려한 조건을 설명하겠다.
N의 크기가 2~100 까지인데 벽까지 고려하여 배열의 크기를 arr[102][102]로 선언하였다. 즉, 만약 N이 100일때 태두리는 벽으로 값을 넣어주기 위함이다.
처음에는 방향이 오른쪽이다. 즉, (1,1)에서 시작해서 (1,2) , (1,3) , (1,4) .... 로 나아가는 것이다. L의 크기에 따라 X 초가 끝난 뒤에 방향의 전환이 이루어진다. 이를 쉽게 하기 위해 dx, dy 배열을 선언하였고 'D'(오른쪽 방향)일때는 +1, 'L'(왼쪽 방향)일때는 -1을 하여 방향을 조절하였다.
게임이 끝나려면 벽에 부딪히거나 자신의 몸에 부딪혀야한다. 자신의 몸은 +2 로 배열에 넣어줬고, 벽은 -1로 배열에 값을 넣어줬기 때문에 만약에 이 둘의 경우에는 게임이 종료된다.
사과를 먹었을 경우는 꼬리를 자르지 않아도 되지만, 사과를 먹지 않았을 경우에는 꼬리를 잘라야한다. 이는 queue 배열로 구현하여 만약 사과를 먹지 않았을 경우에 front에 있는 값을 배열에 값을 0으로 변경하고 pop()을 하여 꼬리를 잘라주었다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int arr[102][102];
int dx[] = { 0, 1,0,-1 };
int dy[] = { 1,0,-1,0 };
int main()
{
int N;
cin >> N;
// 벽을 -1로 만듬!
for (int i = 0; i <= N + 1; i++)
{
arr[0][i] = -1;
arr[i][0] = -1;
arr[N + 1][i] = -1;
arr[i][N + 1] = -1;
}
int K;
cin >> K;
for (int i = 0; i < K; i++)
{
int a, b;
cin >> a >> b;
arr[a][b] = 1;
}
vector<pair<int, char>> dir;
int L;
cin >> L;
for (int i = 0; i < L; i++)
{
int a;
char b;
cin >> a >> b;
dir.push_back({ a,b });
}
int cur_time = 0;
int cur_dir = 0;
//dir 배열에 대한 index
int change_index = 0;
int change_time = dir[change_index].first;
int cur_x = 1;
int cur_y = 1;
arr[cur_x][cur_y] = 2;
queue<pair<int, int>> tail;
tail.push({ cur_x,cur_y });
while (true)
{
cur_time++;
//이동한 위치
cur_x += dx[cur_dir];
cur_y += dy[cur_dir];
if (arr[cur_x][cur_y] == -1 || arr[cur_x][cur_y]==2)
{
// 벽에 부딪힌 경우 || 자기 몸에 부딪힌 경우
break;
}
tail.push({ cur_x,cur_y });
// 사과가 있는 경우
if (arr[cur_x][cur_y] == 1)
{
arr[cur_x][cur_y] = 2;
}
else
{
arr[cur_x][cur_y] = 2;
//꼬리 잘라야됨
pair<int, int> num = tail.front();
arr[num.first][num.second] = 0;
tail.pop();
}
if (change_index < L && cur_time == change_time)
{
// 방향 바꾸는 시간이면
if (dir[change_index].second == 'D')
{
//'D'일때
cur_dir++;
if (cur_dir == 4)
{
cur_dir = 0;
}
}
else
{
//'L'일때
cur_dir--;
if (cur_dir == -1)
{
cur_dir = 3;
}
}
change_index++;
if (change_index < L)
{
change_time = dir[change_index].first;
}
}
}
cout << cur_time;
}