[이것이 코딩테스트다] Chapter12. Q11 뱀
문제풀러 가기
본 포스팅의 해설과 코드는 '이것이 코딩테스트다' 책의 문제와 해설을 보고 본인의 방식으로 풀어쓴 것입니다.
문제
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.
게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.
뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.
- 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.
- 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
- 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.
사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 계산하라.
입력
- 첫째 줄에 보드의 크기
N
이 주어진다.(2 ≤ N ≤ 100)
- 두번째 줄에 사과의 개수
K
가 주어진다.(0 ≤ K ≤ 100)
- 다음
K
개의 줄에는 사과의 위치가 주어지는데, 첫 번째 정수는 행, 두 번째 정수는 열 위치를 의미한다. 사과의 위치는 모두 다르며, 맨 위 맨 좌측 (1행 1열) 에는 사과가 없다.- 다음 줄에는 뱀의 방향 변환 횟수
L
이 주어진다.(1 ≤ L ≤ 100)
- 다음
L
개의 줄에는 뱀의 방향 변환 정보가 주어지는데, 정수X
와 문자C
로 이루어져 있으며. 게임 시작 시간으로부터X
초가 끝난 뒤에 왼쪽(C가 'L') 또는 오른쪽(C가 'D')로 90도 방향을 회전시킨다는 뜻이다.X
는10,000
이하의 양의 정수이며, 방향 전환 정보는X
가 증가하는 순으로 주어진다.입출력 예
- 입력
6 3 3 4 2 5 5 3 3 3 D 15 L 17 D
- 출력
9
시뮬레이션 문제 유형으로 문제에서 요구하는 내용을 실수없이 구현하면 된다.
My Solution
from collections import deque
# 맵 만들기
n = int(input())
board = [[0] * (n+2) for _ in range(n+2)]
for i in range(n+2):
board[i][0]=2
board[i][n+1]=2
board[n+1][i]=2
board[0][i]=2
# 사과 놓기
k = int(input())
for _ in range(k):
x,y = map(int, input().split())
board[x][y]=1
# 방향 정보 삽입
l = int(input())
info=deque([])
for _ in range(l):
s,c = input().split()
info.append((int(s),c))
# 동 남 서 북 순으로(오 아래 왼 위)
d = 0
direction_list = [(0,1), (1,0), (0,-1), (-1,0)]
snake=deque([(1,1)])
count = 0
while True:
x=snake[0][0]
y=snake[0][1]
board[x][y]=2
n_x = x + direction_list[d][0]
n_y = y + direction_list[d][1]
snake.appendleft((n_x,n_y))
count+=1
# 벽이거나 나 자신을 만나면 끝
if board[n_x][n_y]==2:
print(count)
break
# 사과 없으면 꼬리 지우기 있으면 늘어난 상태로 진행
elif board[n_x][n_y]==0:
tmp=snake.pop()
board[tmp[0]][tmp[1]] = 0
# 방향 바꾸기
if info:
if count==info[0][0]:
if info[0][1]=='L':
d = (d-1) % 4
elif info[0][1]=='D':
d = (d+1) % 4
info.popleft()
deque
를 사용했다.-2 % 4
는 4 * -1(몫) +2(나머지)
이기에 2
이다.