'뱀'은 머리가 붙었다가 꼬리가 떼졌다가 즉 앞뒤로 데이터를 넣었다가 뺐다가 해야 하는 이유로 deque를 사용했다.
board에서 뱀은 2, 사과는 1, 나머지는 0으로 표시했다.
move 리스트에 담은 L개의 방향 전환 정보는 '게임 시작 후 X초가 지난 후에 방향을 전환한다'는 뜻이다.
time을 증가시켜가면서 매 초마다 move 안에 담긴 X초와 같은지 비교하고, 같으면 방향을 바꿨다.
그리고 그렇게 방향을 전환했을 때마다 move 리스트의 인덱스를 가리키는 idx를 1씩 증가시켰다.
방향 전환이 끝나도 뱀은 계속해서 이동하므로 while True: 안에서 이동하도록 해 주었다.
import sys
from collections import deque
def Print(lst):
for i in lst:
for j in i:
print(j, end=' ')
print("")
print("")
def get_next_direction(now, rotate): # (현재 방향, 움직임 명령(L or D))
if now == 0:
if rotate == 'L':
return 2
else:
return 3
elif now == 1:
if rotate == 'L':
return 3
else:
return 2
elif now == 2:
if rotate == 'L':
return 1
else:
return 0
elif now == 3:
if rotate == 'L':
return 0
else:
return 1
def solve():
time = 0
idx = 0 # move의 인덱스
direct = 0 # 초기 방향 -> (0)
while True:
time += 1
next_r, next_c = snake[0][R] + dx[direct], snake[0][C] + dy[direct]
if 0 <= next_r < N and 0 <= next_c < N:
if board[next_r][next_c] == SNAKE: # 몸에 부딪힘
return time
snake.appendleft([next_r, next_c]) # 새로운 머리
if board[next_r][next_c] != APPLE:
tail_r, tail_c = snake.pop()
board[tail_r][tail_c] = 0
board[next_r][next_c] = SNAKE
else: # 벽에 부딪힘
return time
if idx < L:
if time == move[idx][0]:
direct = get_next_direction(direct, move[idx][1]) # 현재 방향, 다음 회전 명령
idx += 1
dx = (0, 0, -1, 1)
dy = (1, -1, 0, 0)
R, C = 0, 1
APPLE, SNAKE = 1, 2
input = sys.stdin.readline
N = int(input())
board = [[0 for _ in range(N)] for _ in range(N)]
board[0][0] = 2 # 처음에 뱀은 (0, 0)에 위치하고 있음
K = int(input())
for _ in range(K):
i, j = map(int, input().split())
board[i-1][j-1] = APPLE
L = int(input()) # 뱀의 방향 전환 정보
move = []
for _ in range(L):
i, j = input().split()
move.append([int(i), j])
snake = deque([[0, 0]]) # row, col
print(solve())
'알고리즘 > 시뮬레이션' 카테고리의 다른 글
17837번. 새로운 게임 2 (0) | 2020.05.03 |
---|---|
17822번. 원판 돌리기 (0) | 2020.05.02 |
17140번. 이차원 배열과 연산 (0) | 2020.04.27 |
SWEA 2382번. 미생물 격리 (0) | 2020.04.24 |
17144번. 미세먼지 안녕! (0) | 2020.04.21 |