23352๋ฒ - ๋ฐฉํ์ถ
์ด๋ฒ๋ฌธ์ ๋ ์ฝ๋๊ฐ ์๋นํ ๋ํฐํฉ๋๋ค.
๊ทธ ์ด์ ๋
์ด๋ ๊ฒ ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ 50 X 50 ์ด๋ผ๋ ๋๋ํ ์ฌ์ด์ฆ๋ก ์ฃผ์
จ๊ธฐ์
์๊ฐ์ ํ์ ์ผ๋ํ ํ์ ์์ด ๋ฐฐ์ด์ ๋ณต์ฌ ๋ฐ ํ์์ ๊ฑฐ๋ฆฌ๋์์ด ์ฌ์ฉํ์ฌ ํ์ดํ ์ ์์์ต๋๋ค.
๋ฌผ๋ก ๊น๋ํ๊ณ ๋น ๋ฅด๊ฒ ํผ๋ค๋ฉด ์ข๊ฒ ์ง๋ง ๊ทธ๊ฑด ์ค๋ ฅ์ด ๋๋ ์ฌ๋๋ค ์ด์ผ๊ธฐ๊ณ ์ ๋ ๊ณจ๋๋ฌธ์ ํธ๋ ๊ฒ๋ง์ผ๋ก ๊ฐ์ง๋์ง...
BFS๋ ์ด๋ ค์ธ ๊ฒ ์์ด ํญ์ ๋จน๋ ๊ทธ ๋ง์
๋๋ค.
๊ทธ๋ํ๋ฅผ ๋ชจ๋ 1๋ก ๋ฐ๊ฟจ์ผ๋ ํ์ฌ๊ฑฐ๋ฆฌ + 1์ ๋ค์ ๊ฑฐ๋ฆฟ๊ฐ์ ๋์
ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
from collections import deque
import sys
import copy
input = sys.stdin.readline
que,sys,copy๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ
dx = [-1,1,0,0]
dy = [0,0,1,-1]
์ํ์ข์ฐ ์ง์ ํ ๋ค์์
def bfs(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
์ํ์ข์ฐ ํ์ ์ค ๊ทธ๋ํ๋ฅผ ๋์ด๊ฐ๋ฉด continue๋ก ์คํตํด์ฃผ๊ณ
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
que.append([nx,ny])
๋ง์ฝ ๋ค์ ํ์์ง์ ์ด 1์ด๋ผ๋ฉด ํ์ฌ ํ์์ง์ + 1์ ๋ค์ ํ์์ง์ ์ ๋ฃ์ด์ฃผ๊ณ ๋ค์ ํ์์ง์ ์ผ๋ก ๋์ด๊ฐ๋๋ค.
๋ค๋ง ์ด๋ฐ์ฉ์ผ๋ก ์์ฑํ๋ฉด ์ฒซ ์์์ง์ ์ด ๋ค์ ์ฐธ์กฐ๋์ด ๋ณ์๊ฐ ์ค์ผ๋๋ฏ๋ก
if graph[i][j] != 0: bfs(i,j) graph[i][j] = 1
์๊น ์์์ graph[i][j]๋ฅผ 1๋ก ์ด๊ธฐํํด์ค ์ด์ ๊ฐ ์ด๋ฐ ์ฐ์ ์ ๋๋ค.
return [x,y]
๋ง์ง๋ง์ผ๋ก ์ข ์ ๊ฐ์ ๋ฆฌํด๊ฐ์ผ๋ก ์ก์ผ๋ฉด ๋ฉ๋๋ค.
์ด๋ฒ๋ฌธ์ ์ ๊ทผ ํ์์ ๊ฐ๋จํ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋จผ์ BFS๋ก ์์์ ~์ข
์ ๊น์ง ๋ค ํ์ํ ํ, ๊ทธ ๊ฑฐ๋ฆฌ๋ฅผ ๋์ถํฉ๋๋ค.
ํด๋น ๊ฑฐ๋ฆฌ๊ฐ์ด ๊ฐ์ฅ ํฌ๋ค๋ฉด ์์๊ณผ ์ข
์ ์ ํด๋น๋๋ ์ธ๋ฑ์ค ๊ฐ์ ๋ํ์ฌ ๋ฆฌํดํ๋ฉด ๋์
๋๋ค.
N,M = map(int,input().split())
que = deque()
graph = []
for _ in range(N):
graph.append(list(map(int,input().split())))
graph_copy = copy.deepcopy(graph)
์ผ๋จ BFS ์ฌ์ฉ์ ์ํด์ ๊ธฐ๋ณธ์ ์ธ que์ ๊ทธ ์ธ ๊ฒ๋ค์ ๋ฐ์์ฃผ๊ฒ ์ต๋๋ค.
for i in range(N):
for j in range(M):
if graph[i][j] != 0:
graph[i][j] = 1
๊ทธ๋ฆฌ๊ณ ์์์ ~์ข ์ ๊ฑฐ๋ฆฟ๊ฐ ํ์์ ์ํด ์ธ๋ฑ์ค ๊ฐ์ ์ ์ graph_copy์ ๋ฃ์ด๋๊ณ 0(๋งํ๊ตฌ๊ฐ)์ ์ ์ธํ ๋๋จธ์ง ์ธ๋ฑ์ค๋ ์ฃ๋ค 1๋ก ๋ฐ๊พธ๊ฒ ์ต๋๋ค.
graph_copy_distance = copy.deepcopy(graph)
max_distance = 0
for i in range(N):
for j in range(M):
if graph[i][j] != 0:
bfs(i,j)
graph[i][j] = 1
if max_distance <= max(map(max,graph)):
max_distance = max(map(max,graph))
graph = copy.deepcopy(graph_copy_distance)
ํ์์ ์์ํฉ๋๋ค.
graph_copy_distance์ ์๊น ์ฃ๋ค 1๋ก ๋ง๋ ๊ทธ๋ํ๋ฅผ ๋ณต์ฌํด์ฃผ๊ณ
๊ฐ ์ธ๋ฑ์ค๋ง๋ค bfs ํ์์ ๋๋ ค์ ์์์ ๋ถํฐ ์ข
์ ๊น์ง์ ๊ฑฐ๋ฆฟ๊ฐ์ ์ธก์ ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ max_distance์ ์ต๋๋ก ๋์จ ๊ฑฐ๋ฆฟ๊ฐ์ ๋์
ํฉ์๋ค.
ans = []
ans_tmp = 0
for p in range(N):
for k in range(M):
if graph[p][k] != 0:
[ans_x,ans_y] = bfs(p,k)
graph[p][k] = 1
ans_tmp = 0
if max(map(max,graph)) == max_distance:
ans_tmp += graph_copy[p][k]
ans_tmp += graph_copy[ans_x][ans_y]
graph = copy.deepcopy(graph_copy_distance)
ans.append(ans_tmp)
์ด์ ๋ค์ ํ์์ ๋์ ์ข
์ ์ bfs return ๊ฐ์ผ๋ก ๋ฐ์์ค๊ณ ๋ง์ฝ ํ์ฌ ํ์์ค์ธ ๊ทธ๋ํ๊ฐ ๊ฑฐ๋ฆฟ๊ฐ์ ์ต๋๋ฅผ ๋ณด์ฌ์ค๋ค๋ฉด
์์์ ๊ณผ ์ข
์ ์ ans_tmp์ ๋ด์ ans๋ฐฐ์ด์ ์ถ๊ฐํด์ฃผ๋๋ก ํฉ์๋ค.
try:
print(max(ans))
except:
print(0)
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ans_tmp์ ์งํฉ์ค์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์ถ๋ ฅํ๋ฉด ๋ต์ด ๋์ต๋๋ค.