17836 - ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ!
ํ์คํ ์ค๋ฒ์ ๊ณจ๋ ์ฌ์ด์๋ ๋์ ์ ์๋ ์ฐจ์์ ๋ฒฝ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ ๋ฅผ ํ๋ฒ ๋ ๊ผฌ์๋จ๋ค๊ณ ํด์ผ ํ๋...
(0,0)์ ์ฉ์ฌ๊ฐ ์๊ณ (N,M) ๊ทธ๋ฌ๋๊น ๋์๋ฝ์ ๊ณต์ฃผ๊ฐ ์์ต๋๋ค. ์ฉ์ฌ๊ฐ ๊ณต์ฃผํํ ๊ฐ ์ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ ์๊ฐ์์ ๊ตฌํ์ผ๋ฉด ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ, ์๊ฐ ์์ ๊ตฌํ์ง ๋ชปํ๋ค๋ฉด Fail์ ์ถ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
๋จ, ์ด ๋ง์์ฑ ์์๋ ์ ์ค์ ์ฑ๊ฒ ๊ทธ๋์ด ์กด์ฌํฉ๋๋ค. ๊ทธ๋์ ํ๋ํ ๊ฒฝ์ฐ ๋ชจ๋ ๋ฒฝ์ ๋ซ๊ณ ๊ฐ๋ ๊ฐ์นํธ ๋ฒฝ๋ซ๊ธฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ผ๋จ ์ ๊ฐ ๋ฌธ์ ๋ฅผ ์ฒ์ ๋ณด๊ณ ์๊ฐํด๋ธ๊ฑด
1. ๊ฒ์ ํ๋ํ๋ ๊ฒฝ์ฐ
2. ๊ฒ์ ํ๋ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ
๋ฅผ ๊ฐ๊ฐ ๋๋์ด ๊ณ์ฐํ๊ณ ๋ง์ง๋ง์ ํ์ฒ๋ฆฌ๋ก ๊ฐ์ฅ ์งง์ ์๊ฐ ๋ด์ ๊ณต์ฃผ๋ฅผ ๊ตฌํ ์ ์๋ ๊ฐ์ ๋์ถํ๋๊ฒ ์ ์ผ ๋ฒ ์คํธ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋จผ์ ๊ธฐ๋ณธ์ ์ธ ์ ์ธ๊ฐ์๊ฑธ ๋ฐ์์ต์๋ค.
from collections import deque
import copy
N,M,T = map(int,input().split())
que = deque()
graph = []
for _ in range(N):
graph.append(list(map(int,input().split())))
graph2 = copy.deepcopy(graph)
๊ทธ๋ํ๋ ๋ง์์ฑ ํฌ๊ธฐ, ๊ณต์ฃผ ๊ตฌํ๋ ์๊ฐ ๋ฑ์ ๋ฐ์์ฃผ๊ณ ๊ฒ์ ํ๋ํ๋ ๊ฒฝ์ฐ์ ๊ฒ์ ํ๋ํ์ง ๋ชปํ ์ผ์ด์ค๋ฅผ ๋ ๋ค ๊ณ์ฐํด์ฃผ๊ธฐ ์ํด์ ๊น์ ๋ณต์ฌ deepcopy๋ฅผ ํ์ฌ graph์ ๋๊ฐ์ graph2๋ฅผ ํ๋ ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
๋ํ ์ธ์ ๋ BFS ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๊ธฐ ์ํ que๋ฅผ ๋ถ๋ฌ์์ฃผ๊ณ
yes_gram = abs(bfs_yesgram(0,0))
no_gram = abs(bfs_nogram(0,0))
์ ์ค์ ์ฑ๊ฒ ๊ทธ๋์ ํ๋ํ ๊ฒฝ์ฐ๋ฅผ yes_gram, ๊ทธ๋์ ํ๋ํ์ง ๋ชปํ ๊ฒฝ์ฐ๋ฅผ no_gram์ผ๋ก ๊ฐ๊ฐ ๋๋์ด ๋ณ์๋ก์จ ๋ด์์ฃผ๊ฒ ์ต๋๋ค.
์ ๋จผ์ ๋ ๊ฐ๋จํ ๊ณ์ฐ๊ฐ๋ฅํ ๊ฒ์ ํ๋ํ์ง ๋ชปํ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ด
์๋ค.
ํ
์คํธ์ผ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉด ๋ฒฝ์ 1, ์ ์ค์ ์ฑ๊ฒ ๊ทธ๋์ 2๋ก ํ๊ธฐ๊ฐ ๋์ด ์์ต๋๋ค.
๋ง์ฝ BFS๋ฅผ ์คํํ๊ธฐ ์ํด์ ๊ฐ ์๋ฆฌ ๋ฐฉ๋ฌธ์๋ฅผ ๋จ์ํ +1์ฉ ์ฆ์ง์ํจ๋ค๋ฉด ๊ณ์ฐํ๋ ๋์ค ์ ๋ฒฝ๊ณผ ๊ทธ๋์ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ ์์๋ก ๊ฐ ์๋ฆฌ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ๊ธฐํด์ฃผ๊ฒ ์ต๋๋ค.
dx = [0,0,-1,1]
dy = [1,-1,0,0]
def bfs_nogram(x,y):
que.append([x,y])
while que:
x,y = que.popleft()
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if nx<0 or ny<0 or nx>=N or ny>=M:
continue
์ํ์ข์ฐ ํ์ ๊ธฐ์ค dx์ dy๋ฅผ ์ ์ธํด์ฃผ๊ณ x๋ y, ๊ทธ๋ฌ๋๊น ์์์ 0,0 ๋ถํฐ ๋ฐ์ 4๋ฐฉํฅ ํ์์ ์ญ ์งํํด์ค์๋ค.
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y] - 1
que.append([nx,ny])
return graph[N-1][M-1]
0์ ๋ฒฝ๋ ์๋๊ณ ์ฑ๊ฒ ๊ทธ๋๋ ์๋ ๋ค์ ํ์์ด ๊ฐ๋ฅํ ์ธ๋ฑ์ค์ด๋ฏ๋ก ๋ง๋ ๊ฒฝ์ฐ์ ์ ์ธ๋ฑ์ค -1๋ก ํ๊ธฐํด์ค์๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ด ๋ค ๋๋๋ค๋ฉด ๋ฆฌ์คํธ๋ 0๋ถํฐ ์์ํ๋ฏ๋ก graph[N-1][M-1]์ ๋ฆฌํดํด์ฃผ๋ฉด ๊ฒ์ ํ๋ํ์ง ์๊ณ ๊ณต์ฃผ๋ฅผ ๊ตฌํ ์ ์๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๋์ค๊ฒ ๋ฉ๋๋ค.
์ ํ ์คํธ์ผ์ด์ค๋๋ก ์คํ์์ผ๋ดค์ ๋ ๋์ค๋ ์ถ๋ ฅ๊ฐ. ์ด์ ๊ฒ์๊ธ์๋ ์์ง๋ง 0,0์ 1,0 ๋๋ 0,1์ ํ์์ ์ฌ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ ํจํ ์ถ๋ ฅ๊ฐ์ด ์๋๋๋ค. ํ์ง๋ง ๋ฌธ์ ์ ๋ชฉํ๋ graph[N-1][M-1]์ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ ์ต๋จ๊ฑฐ๋ฆฌ์ด๋ฏ๋ก ํฌ๊ฒ ์ ์๋ฏธํ ๊ฐ์ ์๋๋๋ค.
๊ฒ์ ํ๋ํ ๊ฒฝ์ฐ๋ ๋๋ฒ ๋๋์ด์ ์๊ฐํด๋ด์ผ ํฉ๋๋ค.
1. ๊ฒ๊น์ง ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ
2. ํด๋น ๊ฒ์์ ์ข
๋ฃ์ง์ graph[N-1][M-1]๊น์ง ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ
๊ทธ๋ฌ๋๊น ๋ฐ์ง๊ณ ๋ณด๋ฉด ์์์ ->๊ฒ ๊ตฌํ๊ณ ๊ฒ->์ข
๋ฃ์ง์ ๊ตฌํด์ ๋์ด ๋ํ๋ฉด ๋๋ค๋ ์๋ฆฌ์
๋๋ค.
๊ตณ์ด ์๋ํ๊ณ ๊ฒ์ ์ต๋จ๊ฑฐ๋ฆฌ ๊ธฐ๋กํด๋๊ณ ๋ค์ BFS ๋๋ ค๋ ๋๊ตฌ์.
def bfs_yesgram(x,y):
que.append([x,y])
while que:
x,y = que.popleft()
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if nx<0 or ny<0 or nx>=N or ny>=M:
continue
if graph2[nx][ny] == 0:
graph2[nx][ny] = graph2[x][y] - 1
que.append([nx,ny])`
๋จผ์ ์ด๋ฐ๋ถ๋ ์์ BFS ์ฝ๋์ ์ผ์นํฉ๋๋ค. ์ผ๋จ ๊ฒ๊น์ง ๊ฐ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ผ ํ๋๊น์.
if graph2[nx][ny] == 2:
graph2[nx][ny] = graph2[x][y] - 1
for n in range(N):
for m in range(M):
if n != nx or m != ny:
graph2[n][m] = 0
que.clear()
que.append([nx,ny])
break
๋ถ๊ธฐ์ ์ ์ฌ๊ธฐ์ ์๊น๋๋ค. ๋ง์ฝ ์ ์ค์ ์ฑ๊ฒ(2) ๊ทธ๋์ ๋ง๋ฌ๋ค๋ฉด ์ผ๋จ ๊ฒ์ด ์๋ ํด๋น ์ธ๋ฑ์ค์ ๊ฑฐ๊ธฐ๊น์ง ๊ฐ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํด์ค๋๋ค.
์๋จ ํ
์คํธ์ผ์ด์ค๋๋ก๋ผ๋ฉด ์ด๋ฐ ์ถ๋ ฅ์ด๊ฒ ์ง์?
์ -6์๋ฆฌ๊ฐ ์ฑ๊ฒ ๊ทธ๋์ ์ป๋ ์ต๋จ ๊ฑฐ๋ฆฌ์ธ ๊ฒ๋๋ค.
์ด๋ ๊ฒ ๊ทธ๋์ ์ป์๋ค๋ฉด ์ ํฌ๋ ํฌ๋์ ๊ฐ์ฌ๊ธฐ ์นํธ ๋ฒฝ๋ซ๊ธฐ๋ฅผ ์์ ํ ์ ์์ต๋๋ค.
์ด์ ์ ์ต๋จ๊ฑฐ๋ฆฌ ๊ธฐ๋กํด๋ ๊ฒ๋ค๊ณผ ๋ฒฝ์ ์น๋ค ๋ ๋ ค๋ฒ๋ฆฝ์๋ค. (ํ ์ด๊ธฐํ, ํ์ ๊ฒ์์น(ํ์ฌ์ง์ ) ๋ฃ์ด์ ํ์ ์ ๋)
ํ์ธต ๊น๋ํด์ก๋ค์.
์ด์ BFS๋ฅผ ๋ค์ ๋๋ ค ๊ฒ->์ข
๋ฃ์ง์ graph[N-1][M-1] ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๊ฒ์์ ์ข
๋ฃ์ง์ ๊น์ง ์ต๋จ๊ฑฐ๋ฆฌ๋ 4์ด๋ฉฐ ์ต์ข
์ ์ผ๋ก ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ ์ต๋จ๊ฑฐ๋ฆฌ๋ 10์ด๊ฒ ๋ค์.
์ญ์ ๊ณจ๋๋ฌธ์ ๋ ํ์ ์ค๋ฒ๋ฌธ์ ์๋ ์ฐจ์์ด ๋ค๋ฅด๊ฒ ์ถ๋ ฅ์กฐ์ฐจ ๋ณต์กํฉ๋๋ค.
๊ธฐ์ตํ์ค์ง ๋ชจ๋ฅด์๊ฒ ์ง๋ง ์ ํฌ๊ฐ ์ฒ์์ T๋ผ๋ ๋ณ์๋ฅผ ๋ฐ์์ฃ ? ์ด ์๊ฐ ์์ ๊ณต์ฃผ๋ฅผ ๋ชป๊ตฌํ๋ฉด ๋ฌด์กฐ๊ฑด Fail์ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋จ์ ๋ณด์๋ ํ
์คํธ์ผ์ด์ค์ฒ๋ผ ๋ฒฝ์ด ์์ ๋งํ ๊ตฌํ๋ฌ ๊ฐ์ง ๋ชปํ ๊ฒฝ์ฐ๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
if yes_gram == 0 or no_gram == 0:
if yes_gram == 0 and no_gram != 0:
if no_gram <= T:
print(no_gram)
else:
print('Fail')
elif yes_gram != 0 and no_gram == 0:
if yes_gram <= T:
print(yes_gram)
else:
print('Fail')
else:
print('Fail')
์ผ๋จ ๋ ์ค์ ํ๋๋ผ๋ 0์ด ์๋ค๋ฉด์ if๋ฌธ์ผ๋ก ๋ง๋ค์ด์ค๋๋ค.
๋๋ค 0์ด๋ผ๋ฉด ๋ฒฝ์ ๋งํ ์์ฝ๊ฒ๋ ๊ณต์ฃผ๋ฅผ ๊ตฌํ๋ฌ ๊ฐ์ง ๋ชปํ๋ฏ๋ก Fail์ ์ถ๋ ฅํด์ค๋๋ค.
๋ง์ฝ ํ๋๋ง 0์ด๋ผ๋ฉด ๋๋จธ์ง 0์ด ์๋ ๊ฐ์ T์ ๋์กฐํด๋ณด๊ณ T์ด ์ดํ๋ก ๊ตฌํ๋๊ฒ ๊ฐ๋ฅํ๋ค๋ฉด ํด๋น ๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก T์ด ์ด๊ณผ๋ฉด Fail์ ์ถ๋ ฅํด์ค๋๋ค.
else:
if min(yes_gram,no_gram) > T:
print('Fail')
else:
print(min(yes_gram,no_gram))
๋ง์ฝ ๋๋ค ๊ฐ์ด 0์ด ์๋๋ผ๋ฉด ๋ ์์ ๊ฐ๊ณผ T๋ฅผ ๋์กฐํด์ T์ด ์ดํ๋ก ๊ตฌํ๋ ๊ฒ ๊ฐ๋ฅํ๋ค๋ฉด ํด๋น ๊ฐ์, ์๋๋ฉด Fail์ ์ถ๋ ฅํ๋ฉด ๋๋ฉ๋๋ค.
from collections import deque
import copy
dx = [0,0,-1,1]
dy = [1,-1,0,0]
def bfs_yesgram(x,y):
que.append([x,y])
while que:
x,y = que.popleft()
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if nx<0 or ny<0 or nx>=N or ny>=M:
continue
if graph2[nx][ny] == 0:
graph2[nx][ny] = graph2[x][y] - 1
que.append([nx,ny])
if graph2[nx][ny] == 2:
graph2[nx][ny] = graph2[x][y] - 1
for n in range(N):
for m in range(M):
if n != nx or m != ny:
graph2[n][m] = 0
que.clear()
que.append([nx,ny])
break
return graph2[N-1][M-1]
def bfs_nogram(x,y):
que.append([x,y])
while que:
x,y = que.popleft()
for i in range(4):
nx = dx[i] + x
ny = dy[i] + y
if nx<0 or ny<0 or nx>=N or ny>=M:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y] - 1
que.append([nx,ny])
return graph[N-1][M-1]
N,M,T = map(int,input().split())
que = deque()
graph = []
for _ in range(N):
graph.append(list(map(int,input().split())))
graph2 = copy.deepcopy(graph)
yes_gram = abs(bfs_yesgram(0,0))
no_gram = abs(bfs_nogram(0,0))
if yes_gram == 0 or no_gram == 0:
if yes_gram == 0 and no_gram != 0:
if no_gram <= T:
print(no_gram)
else:
print('Fail')
elif yes_gram != 0 and no_gram == 0:
if yes_gram <= T:
print(yes_gram)
else:
print('Fail')
else:
print('Fail')
else:
if min(yes_gram,no_gram) > T:
print('Fail')
else:
print(min(yes_gram,no_gram))