-
Notifications
You must be signed in to change notification settings - Fork 0
/
뱀.py
63 lines (55 loc) · 1.99 KB
/
뱀.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
def move(snack, dir): # 뱀의 이동
if dir == 1: # 상
snack.insert(0, [snack[0][0] - 1, snack[0][1]])
elif dir == 2: # 우
snack.insert(0, [snack[0][0], snack[0][1] + 1])
elif dir == 3: # 하
snack.insert(0, [snack[0][0] + 1, snack[0][1]])
else: # 좌
snack.insert(0, [snack[0][0], snack[0][1] - 1])
def direction_change(snack, direction, dir):
if direction == "D":
return dir % 4 + 1
else:
if dir == 1:
return 4
else:
return dir - 1
if __name__ == "__main__":
# 입력
N = int(input()) # 보드의 크기
array = [[0] * N for _ in range(N)] # 맵 초기화
K = int(input()) # 사과의 크기
for _ in range(K):
r, c = map(int, input().split())
array[r - 1][c - 1] = 1 # 사과 정보 저장
L = int(input()) # 뱀의 방향 변환 횟수
change = [] # 뱀의 방향 변환 정보 저장
for _ in range(L):
time, direction = input().split()
change.append((int(time), direction))
# 1 - 상, 2 - 우, 3 - 하, 4 - 좌 방향
snack = [[0, 0]] # 머리
dir = 2 # 방향
time = 0
while True:
move(snack, dir) # 머리 이동
time += 1
# 자기 몸에 닿인 경우
for i in range(1, len(snack)):
if [snack[0][0], snack[0][1]] == [snack[i][0], snack[i][1]]:
print(time)
exit(0)
if snack[0][0] < 0 or snack[0][0] >= N or snack[0][1] < 0 or snack[0][1] >= N: # 벽을 만나는 경우
break
# 사과 여부 확인
if array[snack[0][0]][snack[0][1]] == 1: # 사과가 있다면
array[snack[0][0]][snack[0][1]] = 0 # 사과 제거
pass # 꼬리 변동 x
else:
snack.pop()
# 방향 전환 여부 확인
if len(change) >= 1 and change[0][0] == time:
t, direction = change.pop(0)
dir = direction_change(snack, direction, dir)
print(time)