DevYoon
[๋ฐฑ์ค] 16234. ์ธ๊ตฌ ์ด๋ (Python) ๋ณธ๋ฌธ
link ๐ https://www.acmicpc.net/problem/16234
โ๏ธ ๊ตญ๊ฒฝ์ ์๋ก ๊ณต์ ํ๋ ๊ตญ๊ฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ ๋ฆฌ์คํธ์ ๋ฐ๋ก ๋ด์์ฃผ์๋ค (deque์์๋ pop์ ํ๋๊น)
โ๏ธ union(๊ตญ๊ฒฝ ๊ณต์ ๊ตญ๊ฐ ๋ด์์ฃผ๋ ๊ณณ)์ ์ฒ์์ set์ผ๋ก ํ๋๋ฐ, 80% ์ฏค์์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์ list๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
โ๏ธ ๋ด์๋ ์ค๋ณต ๋ฐฉ์งํ๊ฒ ๋ค๊ณ set์ ์ด ๊ฑฐ์๋๋ฐ, ์๊ฐํด๋ณด๋ set์ ์ฐ์ง ์์๋ ์ค๋ณต๊ฐ์ด ๋ค์ด๊ฐ ์ผ์ด ์์๋ค.
from collections import deque
def BFS(y, x):
q = deque()
q.append((y, x))
union = set()
union.add((y, x))
while q:
ny, nx = q.popleft()
dir = [(-1, 0), (1, 0), (0, 1), (0, -1)]
for i, j in dir:
dy, dx = ny+i, nx+j
if 0 <= dy < N and 0 <= dx < N and visit[dy][dx] != 1:
if L <= abs(board[ny][nx] - board[dy][dx]) <= R: # ์ธ๊ตฌ์ ์ฐจ์ด๊ฐ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด
visit[dy][dx] = 1 # ๋ฐฉ๋ฌธ ์ฒดํฌ
q.append((dy, dx)) # q์ ๋ด์์ฃผ๊ธฐ
if (dy, dx) not in union:
union.add((dy, dx)) # union set์ ๋ด์์ฃผ๊ธฐ (๊ตญ๊ฒฝ ๊ณต์ )
return union
N, L, R = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
ans = 0
while True:
visit = [[0]*N for _ in range(N)]
flag = False
for y in range(N):
for x in range(N):
if visit[y][x] != 1:
visit[y][x] = 1
nation = BFS(y, x) # ํ ๋ฒ๋ ๋ค๋ฆฐ ์ ์์ผ๋ฉด BFS ๋๋ฆฌ๊ธฐ
if len(nation) > 1: # ๊ตญ๊ฒฝ์ ์ด์๋ค๋ ๋ป (1์ด๋ฉด ๊ตญ๊ฐ 1๊ฐ์ด๋ฏ๋ก ์ฐ์ฐํ ํ์ X)
flag = True # flag ๋ฐ๊พธ๊ธฐ
res = 0
for i, j in nation: # ๊ตญ๊ฒฝ์ ๊ณต์ ํ๊ณ ์๋ ๊ตญ๊ฐ๋ค ์ธ๊ตฌ ์ ๋ค ๋ํ๊ณ
res += board[i][j]
res //= len(nation) # ๊ณต์ ํ๊ณ ์๋ ๊ตญ๊ฐ ์๋ก ๋๋๊ธฐ
for i, j in nation:
board[i][j] = res # ์ธ๊ตฌ์ ์ฌ๋ถ๋ฐฐ
if flag == False: # ๊ตญ๊ฒฝ์ ์ฐ ์ ํ ๋ฒ๋ ์์ผ๋ฉด
break # ๋ธ๋ ์ดํฌ
ans += 1 # +1์ผ
print(ans)