โ 19237 ์ด๋ฅธ ์์ด โ
import sys
input=sys.stdin.readline
from collections import deque
N,M,k=map(int,input().split()) #NxNsize / M sharks / smell limit k
trace=[]
smell=[[0]*N for _ in range(N)]
sharks=deque()
shark_ds_priorities=[]
#shark_ds
dx,dy=['?',-1,1,0,0],['?',0,0,-1,1]
num_of_sharks=M
for i in range(N):
l=list(map(int,input().split()))
trace.append(l)
for j in range(N):
if l[j] != 0:
sharks.append((i,j,l[j])) #x,y,shark_num
smell[i][j] = k
shark_ds=list(map(int,input().split()))
for _ in range(M):
d=[]
for _ in range(4):
d.append(list(map(int,input().split())))
shark_ds_priorities.append(d)
time=0
while 1:
#spread smell
for shark in sharks:
smell[shark[0]][shark[1]] = k
#move
for _ in range(len(sharks)):
x,y,num = sharks.popleft()
#in shark-d priorities
moved,my_trace=False,[]
for next_d in shark_ds_priorities[num-1][shark_ds[num-1]-1]:
nx,ny=x+dx[next_d],y+dy[next_d]
if 0<=nx<N and 0<=ny<N:
if smell[nx][ny] > 0: #if smell
if trace[nx][ny] == num: #if this is my trace
my_trace.append((nx,ny))
continue
else: #if no smell -> move!
moved=True
sharks.append((nx,ny,num))
shark_ds[num-1]=next_d
break
if not moved:
nx,ny=my_trace[0][0],my_trace[0][1] #move to my trace(the 1st one in the list - based on priority)
sharks.append((nx,ny,num))
if nx==(x-1):
shark_ds[num-1]=1
elif nx==(x+1):
shark_ds[num-1]=2
elif ny==(y-1):
shark_ds[num-1]=3
else:
shark_ds[num-1]=4
#disappear smell
for x in range(N):
for y in range(N):
if smell[x][y] > 0:
smell[x][y] -=1
if smell[x][y] == 0:
trace[x][y] = 0
#after moving
shark_list=[]
while sharks:
x,y,num = sharks.popleft()
if trace[x][y] == 0: #no shark exists
trace[x][y] = num
shark_list.append((x,y,num))
else: #if shark exists
if num < trace[x][y]: #mine has more priority
shark_list.remove((x,y,trace[x][y]))
trace[x][y]=num
num_of_sharks-=1
shark_list.append((x,y,num))
elif trace[x][y] < num:
num_of_sharks-=1
else: #trace[x][y] == num
shark_list.append((x,y,num))
for shark in shark_list:
sharks.append(shark)
time+=1
if num_of_sharks == 1:
print(time)
break
if time >= 1000:
print(-1)
break
โ๏ธ
โ trace: ์์ด๊ฐ ์์นํ ์ํ (2์ฐจ์ ๋ฐฐ์ด)
โก smell: ๊ฐ ์์ด์ smell ํํฉ (2์ฐจ์ ๋ฐฐ์ด)
โข sharks: deque() ์ค๋น: (x,y,shark_num) ํํ๋ก ๊ฐ shark๋ง๋ค deque์ ๋ฃ๊ธฐ (deque)
โฃ shark_ds: ๊ฐ ์์ด์ ํ ๋ฐฉํฅ ์ฃผ์ด์ง (1์ฐจ์ list)
โค shark_ds_priorities: ๊ฐ ์์ด์ ์/ํ/์ข/์ฐ์ ๋ฐ๋ฅธ ๋ฐฉํฅ ์ฐ์ ์์ (2์ฐจ์ ๋ฐฐ์ด)
โ๏ธ ์งํ
" ๋งจ ์ฒ์์๋ ๋ชจ๋ ์์ด๊ฐ ์์ ์ ์์น์ ์์ ์ ๋์๋ฅผ ๋ฟ๋ฆฐ๋ค "
โ sharks deque์ ์๋ ๊ฐ ๋ชจ๋ ํ์ฌ shark์ (x,y)์ smell k ๋ฟ๋ฆฌ๊ธฐ (smell[shark[0]][shark[1]] = k)
while 1:
#spread smell
for shark in sharks:
smell[shark[0]][shark[1]] = k
" ๊ทธ ํ 1์ด๋ง๋ค ๋ชจ๋ ์์ด๊ฐ ๋์์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ ์ค ํ๋๋ก ์ด๋ํ๊ณ , "
โก len(sharks)๋งํผ sharks deque์์ shark ๊บผ๋ด๋ฉด์ shark ์ค์ ์ด๋
: shark_ds_priorities์ ๋ฐ๋ผ nx,ny = x + dx[next_d], y + dy[next_d] update
#move
for _ in range(len(sharks)):
x,y,num = sharks.popleft()
#in shark-d priorities
moved,my_trace=False,[]
for next_d in shark_ds_priorities[num-1][shark_ds[num-1]-1]:
nx,ny=x+dx[next_d],y+dy[next_d]
" ๊ฐ ์์ด๊ฐ ์ด๋ ๋ฐฉํฅ์ ๊ฒฐ์ ํ ๋๋, ๋จผ์ ์ธ์ ํ ์นธ ์ค ์๋ฌด ๋์๊ฐ ์๋ ์นธ์ ๋ฐฉํฅ์ผ๋ก ์ก๋๋ค "
โข ์ผ๋จ, nx์ ny๊ฐ 0์ด์ N๋ฏธ๋ง์ธ ์ง (์ฆ ๋ฒ์ ๋ด์ ์๋ ์ง) ํ์ธ ํ, ์๋ฌด ๋์๊ฐ ์๋ค๋ฉด ๋ฐ๋ก ์ด๋! (์๋์ else๋ฌธ)
if 0<=nx<N and 0<=ny<N:
if smell[nx][ny] > 0: #if smell
if trace[nx][ny] == num: #if this is my trace
my_trace.append((nx,ny))
continue
else: #if no smell -> move!
moved=True
sharks.append((nx,ny,num))
shark_ds[num-1]=next_d
break
→ ์ด๋ํ์ผ๋ฏ๋ก moved = True / sharks deque์ updateํ (nx,ny,num) append / shark_ds next_d ๋ฐฉํฅ์ผ๋ก update
" ์ธ์ ํ ์นธ ์ค ์๋ฌด ๋์๊ฐ ์๋ ์นธ์ ๋ฐฉํฅ์ด ์๋ค๋ฉด ์์ ์ ๋์๊ฐ ์๋ ์นธ์ ๋ฐฉํฅ์ผ๋ก ์ก๋๋ค "
โฃ ๋์๊ฐ ์๋ค๋ฉด(์๋ if smell[nx][ny]>0) trace list์ (nx,ny) append (์ โข ์ฝ๋์ ์ค๋ณต)
if smell[nx][ny] > 0: #if smell
if trace[nx][ny] == num: #if this is my trace
my_trace.append((nx,ny))
continue
โค ์๋ฌด ๋์๊ฐ ์๋ ์นธ์ด ์๋ค๋ฉด(moved=False) my_trace []์ ์ฒซ๋ฒ์งธ ์์์ ๋ฐ๋ผ move / shark_ds update
if not moved:
nx,ny=my_trace[0][0],my_trace[0][1] #move to my trace(the 1st one in the list - based on priority)
sharks.append((nx,ny,num))
if nx==(x-1):
shark_ds[num-1]=1
elif nx==(x+1):
shark_ds[num-1]=2
elif ny==(y-1):
shark_ds[num-1]=3
else:
shark_ds[num-1]=4
โฅ ์ด๋ ํ, ๊ฐ ๊ฒฉ์์ ๋์๊ฐ 1์ฉ ์ฌ๋ผ์ง๋ค.
#disappear smell
for x in range(N):
for y in range(N):
if smell[x][y] > 0:
smell[x][y] -=1
if smell[x][y] == 0:
trace[x][y] = 0
โ ์ด ๋ ์ฃผ์์ ! ๋์๊ฐ 0์ด ๋๋ค๋ ๊ฑด ์์ด๊ฐ ์ฌ๋ผ์ง๋ค๋ ๋ป. ๊ทธ ๋๋ trace[x][y] = 0์ผ๋ก ์ค์ ํด ์์ด๋ฅผ ์ฌ๋ผ์ง๊ฒ ํด์ผ ํจ โ
" ๋ชจ๋ ์์ด๊ฐ ์ด๋ํ ํ ํ ์นธ์ ์ฌ๋ฌ ๋ง๋ฆฌ์ ์์ด๊ฐ ๋จ์ ์์ผ๋ฉด, ๊ฐ์ฅ ์์ ๋ฒํธ๋ฅผ ๊ฐ์ง ์์ด๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ๊ฒฉ์ ๋ฐ์ผ๋ก ์ซ๊ฒจ๋๋ค. "
โฆ shark_list [] ๋ง๋ค๊ณ ๊ฐ shark ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๊ฑฐํ๊ฑฐ๋ update / ๋งจ ๋ง์ง๋ง์ shark_list๋ฅผ deque์ ๋ฃ๊ธฐ
#after moving
shark_list=[]
while sharks:
x,y,num = sharks.popleft()
if trace[x][y] == 0: #no shark exists
trace[x][y] = num
shark_list.append((x,y,num))
else: #if shark exists
if num < trace[x][y]: #mine has more priority
shark_list.remove((x,y,trace[x][y]))
trace[x][y]=num
num_of_sharks-=1
shark_list.append((x,y,num))
elif trace[x][y] < num:
num_of_sharks-=1
else: #trace[x][y] == num
shark_list.append((x,y,num))
for shark in shark_list:
sharks.append(shark)
โง ์ ๊ณผ์ ์ด ๋๋ฌ์ผ๋ฏ๋ก time +=1 / num_of_sharks == 1, ์ฆ 1๋ฒ ์์ด 1๋ง๋ฆฌ๋ง ๋จ๊ฑฐ๋ 1000์ด ์ด์์ด๋ฉด print(time) ํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ.
time+=1
if num_of_sharks == 1:
print(time)
break
if time >= 1000:
print(-1)
break
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Math & Geometry Advanced I - 1 Solvedโ (0) | 2024.04.27 |
---|---|
โ Stack & Queue & Deque Advanced I - 1 Solvedโ (0) | 2024.02.24 |
โ Two-Pointers Advanced I - 7 Solvedโ (0) | 2024.02.11 |
โ Implementation&Simluation Advanced I - 5 Solvedโ (0) | 2024.01.28 |
โ Backtracking Upper-Advanced I - 1 Solvedโ (0) | 2024.01.24 |
๋๊ธ