#3190. 뱀
Problem
- N x N 보드판
- 양 끝 모서리에 벽이 있음
- 뱀의 길이 1, 시작 위치 (1, 1), 방향: →
- 매 초마다 이동
- 머리를 다음 칸에 위치
- 이동한 칸에 사과가 있으면 사과 먹고 꼬리 움직이지 않음(몸길이 늘어남)
- 꼬리 움직인다. (몸길이 그대로)
Goal: 사과의 위치와 뱀의 이동경로가 주어질 때 게임이 몇 초만에 끝나는지 계산
게임은 벽이나 자기자신의 몸과 부딪히면 끝난다.
뱀의 이동 경로는 (왼쪽 오른쪽 으로 90도 방향 회전)
- 입력
방향 변환 정보에서 주어진 초는 게임 시작 시간으로부터 X초가 끝난 뒤를 말한다.
Solution
- 주어진 문제대로 구현하면 된다. (시뮬레이션)
- 방향전환 시간은 오름차순으로 주어지기에 queue에 저장
- 사과가 있는 곳은 -1로 표시
- 뱀이 있는 곳은 1부터~현재 길이까지 표시 (머리가 가장 큰 수)
- 머리를 기준으로 현재 방향에 맞게 움직인다.
머리가 움직였을 때 그곳이 벽이거나 자신의 몸인지 확인한다.
필자는 다음과 같은 경우에 뱀이 동시에 움직일거라 생각하여 게임이 안끝난다고 생각했다.// 4가 머리이고 머리가 위쪽으로 가는 경우일 때
1 2 -> 4 1
4 3 3 2
하지만 동시에 움직이지 않고 머리부터 움직여서 꼬리가 따라온다. 그렇기에 위와 같은 경우는 게임이 종료된다.
방향 전환 시간인지 확인한다.
해당 경우에 맞게 방향을 변경한다.사과가 있는지 확인한다.
사과가 있으면 길이가 1 늘어나고 이동하지 않는다.이동한다.
이동방법: 머리에서부터 시작해서 자신보다 1 적은 수를 찾는다. 찾으면 그 값을 넣는다. 이를 총 길이-1만큼 반복하고(머리를 제외하기 때문) 다음 탐색 부분에 머리를, 원래 꼬리 부분을 0으로 변경해준다.1 2 3 4 —> 1 1 2 3 —> 0 1 2 3
5 4 5 4
1 Try
1 |
|