forked from ndb796/python-for-coding-test
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path3.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