forked from ndb796/python-for-coding-test
-
Notifications
You must be signed in to change notification settings - Fork 0
/
3.py
97 lines (87 loc) · 4.04 KB
/
3.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
n, m, k = map(int, input().split())
# 모든 상어의 위치와 방향 정보를 포함하는 2차원 리스트
array = []
for i in range(n):
array.append(list(map(int, input().split())))
# 모든 상어의 현재 방향 정보
directions = list(map(int, input().split()))
# 각 위치마다 [특정 냄새의 상어 번호, 특정 냄새의 남은 시간]을 저장하는 2차원 리스트
smell = [[[0, 0]] * n for _ in range(n)]
# 각 상어의 회전 우선순위 정보
priorities = [[] for _ in range(m)]
for i in range(m):
for j in range(4):
priorities[i].append(list(map(int, input().split())))
# 특정 위치에서 이동 가능한 4가지 방향
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 모든 냄새 정보를 업데이트
def update_smell():
# 각 위치를 하나씩 확인하며
for i in range(n):
for j in range(n):
# 냄새가 존재하는 경우, 시간을 1만큼 감소시키기
if smell[i][j][1] > 0:
smell[i][j][1] -= 1
# 상어가 존재하는 해당 위치의 냄새를 k로 설정
if array[i][j] != 0:
smell[i][j] = [array[i][j], k]
# 모든 상어를 이동시키는 함수
def move():
# 이동 결과를 담기 위한 임시 결과 테이블 초기화
new_array = [[0] * n for _ in range(n)]
# 각 위치를 하나씩 확인하며
for x in range(n):
for y in range(n):
# 상어가 존재하는 경우
if array[x][y] != 0:
direction = directions[array[x][y] - 1] # 현재 상어의 방향
found = False
# 일단 냄새가 존재하지 않는 곳이 있는지 확인
for index in range(4):
nx = x + dx[priorities[array[x][y] - 1][direction - 1][index] - 1]
ny = y + dy[priorities[array[x][y] - 1][direction - 1][index] - 1]
if 0 <= nx and nx < n and 0 <= ny and ny < n:
if smell[nx][ny][1] == 0: # 냄새가 존재하지 않는 곳이면
# 해당 상어의 방향 이동시키기
directions[array[x][y] - 1] = priorities[array[x][y] - 1][direction - 1][index]
# 상어 이동시키기 (만약 이미 다른 상어가 있다면 번호가 낮은 것이 들어가도록)
if new_array[nx][ny] == 0:
new_array[nx][ny] = array[x][y]
else:
new_array[nx][ny] = min(new_array[nx][ny], array[x][y])
found = True
break
if found:
continue
# 주변에 모두 냄새가 남아 있다면, 자신의 냄새가 있는 곳으로 이동
for index in range(4):
nx = x + dx[priorities[array[x][y] - 1][direction - 1][index] - 1]
ny = y + dy[priorities[array[x][y] - 1][direction - 1][index] - 1]
if 0 <= nx and nx < n and 0 <= ny and ny < n:
if smell[nx][ny][0] == array[x][y]: # 자신의 냄새가 있는 곳이면
# 해당 상어의 방향 이동시키기
directions[array[x][y] - 1] = priorities[array[x][y] - 1][direction - 1][index]
# 상어 이동시키기
new_array[nx][ny] = array[x][y]
break
return new_array
time = 0
while True:
update_smell() # 모든 위치의 냄새를 업데이트
new_array = move() # 모든 상어를 이동시키기
array = new_array # 맵 업데이트
time += 1 # 시간 증가
# 1번 상어만 남았는지 체크
check = True
for i in range(n):
for j in range(n):
if array[i][j] > 1:
check = False
if check:
print(time)
break
# 1000초가 지날 때까지 끝나지 않았다면
if time >= 1000:
print(-1)
break