뱀 [3190] with 파이썬 본문
from collections import deque
N = int(input())
K = int(input())
# 지도
map_list = [[0]*N for _ in range(N)]
# 사과 위치
for _ in range(K):
y, x = map(int, input().split())
map_list[y-1][x-1] = 2
# 초 / 회전방향
L = int(input())
change = {}
for i in range(L):
time, dir = map(str, input().split())
change[int(time)] = dir
direction = 0
# 동 서 남 북
dirs = {0:(0,1),1:(0,-1),2:(1,0),3:(-1,0)}
def change_dir(direction, dir):
if direction == 0:
if dir == 'D':
return 2
else:
return 3
elif direction == 1:
if dir == 'D':
return 3
else:
return 2
elif direction == 2:
if dir == 'D':
return 1
else:
return 0
else:
if dir == 'D':
return 0
else:
return 1
time = 0
y, x = 0, 0
snake = deque()
snake.append((y,x))
while True:
time+=1
dy, dx = dirs[direction]
ny, nx = y + dy, x +dx
# 보드 위에 있을 경우
if 0 <= ny < N and 0 <= nx < N:
# 사과인 경우
if map_list[ny][nx] == 2:
snake.appendleft((ny,nx))
map_list[ny][nx] = 1
# 빈 경우
elif map_list[ny][nx] == 0:
map_list[ny][nx] = 1
snake.appendleft((ny,nx))
tail_y, tail_x = snake.pop()
map_list[tail_y][tail_x] = 0
# 자기 몸에 부딪힌 경우
elif map_list[ny][nx] == 1:
break
y, x = ny, nx
# 방향 변환해야 하는 시간인 경우
if time in change:
direction = change_dir(direction, change[time])
else:
break
print(time)
# 문제에서 보드의 상하좌우 끝에 벽이 있다고 해서 0행 N-1행 / 0열 N-1열이 모두 1인 줄 알았지만 사과 위치를 보고 벽은 배열 인덱스 초과한 경우라는 것을 유추함
# 처음에 뱀이 꺾여서도 위치한 자리를 다 알고 있어야 한다는 생각에 너무 복잡하게 생각함... 꺾인 자리를 모두 변수에 저장하여 위치 비교...
# 문제에서 사과 위치도 헷갈렸음...
# 단순히 문제대로만 따라가니 정답...
'Algorithms > Simulation' 카테고리의 다른 글
iSharp [3568] with 파이썬 (0) | 2020.05.29 |
---|---|
드래곤 커브 [15685] with 파이썬 (0) | 2020.05.27 |
[5/25] 취준 Blog Memo - Day 28 (0) | 2020.05.26 |
경사로 [14890] with 파이썬 (0) | 2020.05.26 |
로봇청소기 [14053] with 파이썬 (0) | 2020.05.26 |