p.327
방법 1
N = int(input()) # 보드의 크기
K = int(input()) # 사과의 갯수
apple_p = [] # 사과의 위치
for i in range(K):
apple = list(map(int, input().split()))
apple_p.append(apple)
L = int(input())
d = [] # 방향을 바꾸는 시간과 바뀔 방향
for i in range(L):
td = list(map(str, input().split()))
d.append(td)
d.sort(key=lambda x: int(x[0]))
dcount = 0
count = 0 # 시간을 세는 변수
dire = [(0, 1), (1, 0), (0, -1), (-1, 0)] # 동 남 서 북 (L -1 D 1)
# map위에 사과 그리기
dmap = [[0] * N for _ in range(N)]
for apple in apple_p:
dmap[apple[0] - 1][apple[1] - 1] = 1
snake = []
snake.append((1, 1))
snake_x = 1
snake_y = 1
direction = 0
while True:
count+=1
snake_x = snake_x + dire[direction][0]
snake_y = snake_y + dire[direction][1]
print(snake_x, snake_y,"count = ", count)
if snake_x < 1 or snake_x > N or snake_y < 1 or snake_y > N or dmap[
snake_x-1][snake_y-1] == 9:
print(count)
break
else:
snake.append((snake_x, snake_y))
if dmap[snake_x-1][snake_y-1] == 1:
dmap[snake_x-1][snake_y-1]=9
pass
else:
dmap[snake_x-1][snake_y-1]=9
snake_pop = snake.pop(0)
dmap[snake_pop[0]-1][snake_pop[1]-1] = 0
# 방향 전환
if dcount<L and int(d[dcount][0]) == count:
if d[dcount][1] == 'L':
direction -= 1
if direction < 0:
direction = 3
else:
direction += 1
if direction > 3:
direction = 0
dcount+=1
방법 2
n=int(input())
k=int(input())
data=[[0]*(n+1) for _ in range(n+1)] # 맵 정보
info=[] # 방향 회전 정보
# 맵 정보 (사과 있는 곳은 1로 표시)
for _ in range(k):
a,b=map(int, input().split())
data[a][b]=1
# 방향 회전 정보 입력
l=int(input())
for _ in range(l):
x,c=input().split()
info.append((int(x),c))
# 처음에는 오른쪽을 보고 있으므로(동,남,서,북)
dx=[0,1,0,-1]
dy=[1,0,-1,0]
def turn(direction,c):
if c=='L':
direction=(direction-1)%4
else:
direction=(direction+1)%4
return direction
def simulate():
x,y=1,1 # 뱀의 머리 위치
data[x][y]=2 # 뱀이 존재하는 위치는 2로 표시
direction=0 # 처음에는 동쪽을 보고 있음
t=0 #시작한 뒤에 지난 '초'시간
index=0 # 다음에 회전할 정보
q=[(x,y)] # 뱀이 차지하고 있는 위치 정보(꼬리가 앞쪽)
while True:
nx=x+dx[direction]
ny=y+dy[direction]
# 맵 범위가 안에 있고, 뱀의 몸통이 없는 위치라면,
if 1<=nx and nx<=n and 1<=ny and ny<=n and data[nx][ny]!=2:
# 사과가 없다면 이동 후에 꼬리 제거
if data[nx][ny] == 0:
data[nx][ny]=2
q.append((nx,ny))
px,py=q.pop(0)
data[px][py]=0
# 사과가 있다면 이동 후에 꼬리 그대로 두기
if data[nx][ny]==1:
data[nx][ny]=2
q.append((nx,ny))
# 벽이나 뱀의 몸통과 부딪혔다면
else:
t+=1
break
x,y=nx,ny # 다음 위치로 머리를 이동
t+=1
if index<l and t==info[index][0]:
direction=turn(direction,info[index][1])
index+=1
return t
print(simulate())
방법 3
from collections import deque
import sys
input=sys.stdin.readline
n=int(input())
k=int(input())
board=[[0]*(n+1) for _ in range(n+1)]
for _ in range(k):
a,b=map(int, input().split())
board[b][a]=1 # 사과
l= int(input())
move=deque()
for _ in range(l):
a,b=map(str, input().split())
move.append((int(a),b))
#-------------------------------------------------------
count=0 # 시간
move_time, move_direction = move.popleft()
direction=[[1,0],[0,1],[-1,0],[0,-1]]
direction_count=0 # 오른쪽으로 이동 (x,y)
snake_x, snake_y = 1,1 # 뱀 시작위치
snake=deque()
snake.append((snake_x, snake_y))
while True:
# 벗어나거나, 자기 몸과 닿으면 break
# 뱀 이동, 사과 있으면 머리 위치 add
# 사과 없으면 머리 위치 add후 popleft
# move 시간 되면 돌려(모든 행동 후 맨 마지막 행동)
count+=1
snake_x+=direction[direction_count][0]
snake_y+=direction[direction_count][1]
if snake_x < 1 or snake_y < 1 or snake_x > n or snake_y > n: # 벽에 부딪히면
break
else:
if (snake_x, snake_y) in snake: # 뱀의 몸이 만났을때
break
if board[snake_x][snake_y]==1: # 사과
snake.append((snake_x, snake_y))
board[snake_x][snake_y]=0
elif board[snake_x][snake_y]==0: # 빈 곳
snake.popleft()
snake.append((snake_x, snake_y))
if move_time==count:
if move_direction=='D':
direction_count=(direction_count+1)%4
elif move_direction=='L':
direction_count=(direction_count-1)%4
if move:
move_time, move_direction = move.popleft()
print(count)
댓글