๐ ๋ฐฑ์ค 2468 - ์์ ์์ญ
๐ก ๋์ ํ์ด
๋ฌธ์ ๋ฅผ ์ดํดํ๋ ๋ฐ๋ ์ด๋ ต์ง ์์์ง๋ง, ๊ตฌํํ๋๋ฐ ๋๋ฆ๋๋ก ์ด๋ ค์ ๋ ๋ฌธ์ ์๋ค. ์์ง ๊ตฌํ ์ค๋ ฅ์ด ๋ฐ์ด๋์ง ์์์ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋ค.
N์ ์ต๋ ๋ฒ์๊ฐ 100 * 100
์ด์ด์ ์๊ฐ ๋ณต์ก๋๊ฐ O(N^3)
์ด์ด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ํ๋จํ๋๋ฐ, ๊ฐ์ ์ง์ญ์์ ๋ด๋ฆฌ๋ ๋น์ ์์ ๋ฐ๋ฅธ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์กฐ์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด์ค ๋ฐ๋ณต๋ฌธ์์ ์ผ์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋์ด๋ฌ๋ค.
๋ชจ๋ ๋์ด๋ฅผ ์กฐ์ฌํ ๋๋ ์
๋ ฅ๊ฐ ์ค ๊ฐ์ฅ ์์ ๊ฐ๋ถํฐ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฒ์๋ก ์ก์๋ค. ์ฌ๊ธฐ์ pythonic
์ฝ๋๋ฅผ ๋ฐฐ์ ๋๋ฐ 2์ฐจ์์ ๋ฐฐ์ด์์ min, max
๊ฐ์ ์ฐพ์ ๋ map
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋จํ๊ฒ ์ถ๋ ฅํ ์ ์๋ค. ๋ฐ๋ณต๋ฌธ ์์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฒ์๋ฅผ ์ค์ ํ ๋๋ +1์ ํด์ฃผ์ ์๋๋ฉด ์ค๋ต ํ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ BFSํจ์์์ ๋ณ์๋ฅผ x, y
์ขํ ์ธ์๋ value
๋ฅผ ํ๋ ๋ ์คฌ๋๋ฐ, ๊ตฌํด์ผ ํ๋ ๋์ด๊ฐ ๋ฐ๋ณต๋ฌธ๋ง๋ค ๋ฐ๋๋ฏ๋ก ๋ณ์๋ก ๊ฐ์ด ์ ๋ฌํด์คฌ๋ค.
๋, ํต์ฌ ํฌ์ธํธ๋ BFS๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ํ๋ฒ ๋๊ณ ๋์ฌ ๋๋ง๋ค visited
์ cnt
๋ฅผ ์ด๊ธฐํํด์ค์ผ ํ๋ค. ์ด๊ฑธ ์ ํด์ค์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ ธ๋ ๊ฒ ๊ฐ๋ค.
์ฒซ ์
๋ ฅ ์ขํ๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ์ ์ธํ์ด์ผ ํ๋๋ฐ graph
๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ์ค์ ํ๋๊น ์ถ๋ ฅ์ด ์ ๋๋ก ์ ๋์๋ค. ์ด๊ฑด ํ์ด์ฐธ์ด ๊ณ ์ฅ ๋ ๊ฑฐ์ผ!๋ผ๊ณ ์๊ฐํ์ง๋ง ์ฌ์ค (๋ด ๋จธ๋ฆฌ๊ฐ ๊ณ ์ฅ ๋ฌ์๋ค.)
ํ ์คํธ ์ผ์ด์ค ํ ๊ฐ๋ฅผ ์๋ก ๋ค๋ฉด, ๋์ด๊ฐ 4 ์ดํ์ธ ์ง์ ์ด ๋ชจ๋ ์ ๊ฒผ์ ๋์ ์์ ํ ์์ญ์ ๊ตฌํ ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- BFS ํจ์ ๊ตฌํ(์๋ต)
- ๋ชจ๋ ์ขํ์ ๋ํด ๊ฒ์ฌํ๋ค.(์กฐ๊ฑด: ๊ตฌํ๋ ค๊ณ ํ๋ ๋์ด๊ฐ
graph[i][j]
์ด์์ด๊ณvisited
์ ๋ฐฉ๋ฌธํ ์ ์ด ์์ ๋) - BFS ํจ์๋ฅผ ์คํํ ํ์ ๋์
- ์์ ํ ์์ญ์ ์ต๋๊ฐ ๊ฐฑ์
์ฝ๋ ์ ์ถํ ๋ python3
, pypy
๊ฐ๊ฐ ์ ์ถํ๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ์ ์๊ฐ์ด ๋ค๋ฅด๊ฒ ๊ณ์ฐ๋๋ค.
from collections import deque
import sys
input = sys.stdin.readline
def bfs(x, y, safe_area): # BFS implementation
queue = deque()
queue.append((x, y))
visited[x][y] = 1 # visited mark
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N:
if graph[nx][ny] >= safe_area and visited[nx][ny] == 0:
visited[nx][ny] = 1
queue.append((nx, ny))
N = int(input())
graph = [list(map(int, input().split())) for _ in range(N)]
graph_min = min(map(min, graph)) # min_height
graph_max = max(map(max, graph)) # max_height
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
max_safe_area = graph_min # init min_value
for safe_area in range(graph_min, graph_max+1):
visited = [[0] * N for _ in range(N)]
temp = 0
for i in range(N):
for j in range(N):
if graph[i][j] >= safe_area and visited[i][j] == 0:
bfs(i, j, safe_area)
temp += 1
if temp > max_safe_area: # update safe_zone count
max_safe_area = temp
print(max_safe_area)
'Algorithm > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 11724 - ์ฐ๊ฒฐ ์์์ ๊ฐ์(DFS) (0) | 2021.04.19 |
---|---|
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 11724 - ์ฐ๊ฒฐ ์์์ ๊ฐ์(BFS) (0) | 2021.04.19 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2331 - ๋ฐ๋ณต์์ด (0) | 2021.04.17 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 2667 - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ (0) | 2021.04.16 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 1260 - DFS์ BFS (0) | 2021.04.16 |
๋๊ธ