사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 구하기.
입력 | 출력 |
---|---|
6 3 3 4 2 5 5 3 3 3 D 15 L 17 D | 9 |
10 4 1 2 1 3 1 4 1 5 4 8 D 10 D 11 D 13 L | 21 |
10 5 1 5 1 3 1 2 1 6 1 7 4 8 D 10 D 11 D 13 L | 13 |
: 문제 조건에 따라 구현. 이동에 있어 가중치가 있거나 최단거리로 이동해야하는 것이 아니므로 문제 조건에 따라 잘 구현하면 된다.
뱀이 자신의 몸에 닿으면 안되는데 이때문에 머리와 꼬리의 좌표를 따로 만들어야하나 했다.
하지만 머리와 꼬리 두개의 좌표만으로는 몸 전체의 좌표를 알 수 없으므로 움직일때마다 리스트에 좌표를 저장하고,
꼬리를 비워줄 땐 리스트의 첫번째 원소를 pop하면 된다.
def move(maps, arr):
t = 0 # 시간
x, y = 0, 0 # 처음위치
# 동서남북
dx = [0,0,1,-1]
dy = [1,-1,0,0]
i = 0 # 처음 방향 (dx[0], dy[0])
snake = [] # 뱀 몸의 좌표. 첫번째 인덱스가 꼬리, 마지막 인덱스가 머리.
snake.append((0,0))
while True:
t += 1
# 이동할 좌표
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<n and (nx, ny) not in snake: # 범위 안에 있고 자기 몸이 아니면
snake.append((nx, ny))
if maps[nx][ny] == 1: # 사과 있으면 먹고 0으로 만들어준다.
maps[nx][ny] = 0
else: # 사과 없으면 꼬리 부분 비워줌
snake.pop(0)
x, y = nx, ny # 이동
else: # 몸이나 벽에 부딪히면 끝
return t
#방향 변화
if arr and t == int(arr[0][0]):
if arr[0][1] == 'L':#왼쪽으로
if i==0: i=3
elif i==1:i=2
elif i==2: i=0
elif i==3: i=1
elif arr[0][1] == 'D': #오른쪽으로
if i==0: i=2
elif i==1: i=3
elif i==2: i=1
elif i==3: i=0
arr.pop(0)
n = int(input())
maps = [[0]*n for _ in range(n)]
a = int(input())
for _ in range(a):
x, y = map(int, input().split())
maps[x-1][y-1] = 1
d = int(input())
arr = []
for _ in range(d):
arr.append(input().split())
print(move(maps, arr))