ํ’€์ด


์ธ๊ตฌ ์ด๋™์ด ์–ผ๋งˆ๋‚˜ ์ผ์–ด๋‚˜๋Š”์ง€ ์•Œ์•„๋‚ด์•ผํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ธ๊ตฌ ์ด๋™์€ ์—ฐํ•ฉ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  ํ˜„์žฌ ์ƒํ™ฉ์— ๋งž๋Š” ์—ฐํ•ฉ์„ ์ƒ์„ฑํ•ด์ค˜์•ผํ•œ๋‹ค. ์ด ๋•Œ BFS ๋ฅผ ํ†ตํ•ด ์—ฐํ•ฉ์ด ๊ฐ€๋Šฅํ•œ ๋„์‹œ๋“ค์„ union ์— ๋ฌถ์–ด์ค€ ๋’ค ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ์„œ ์—ฐ์‚ฐ์„ ํ•ด์ฃผ๋ฉด๋œ๋‹ค.

์ฃผ์–ด์ง„ 2์ฐจ์› ๋ฐฐ์—ด์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์—ฐํ•ฉ์ด ์ƒ์„ฑ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ขŒํ‘œ์—์„œ ์—ฐํ•ฉ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•œ ์ง€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋Œ๋ฉด์„œ BFS ๋ฅผ ์‹คํ–‰ํ•ด์ค€๋‹ค. BFS ๋ฅผ ํ†ตํ•ด ์—ฐํ•ฉ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์—ฐํ•ฉ์— ํ•ด๋‹น๋˜๋Š” ๋„์‹œ์˜ ์ธ๊ตฌ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์ค€ ๋’ค ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋˜ ๋„์‹œ๋ฅผ ์ฐพ๊ณ  ๋งŒ์•ฝ ์—ฐํ•ฉ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์œ„ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์ค€๋‹ค.

๋ชจ๋“  ์ขŒํ‘œ์— ๋Œ€ํ•œ ํƒ์ƒ‰์ด ๋๋‚œ ํ›„ ๋ณ€ํ•œ 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ธ๊ตฌ ์ด๋™์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋˜‘๊ฐ™์€ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฐ˜๋ณตํ•œ ์—ฐ์‚ฐ์—์„œ ์—ฐํ•ฉ์ด ํ•˜๋‚˜๋„ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฐ˜๋ณต๋ฌธ์„ ํƒˆ์ถœํ•œ ๋’ค ์ธ๊ตฌ ์ด๋™์ด ์ผ์–ด๋‚œ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด๋œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ


# ์ธ๊ตฌ ์ด๋™
 
from collections import deque
import sys
 
input = sys.stdin.readline
 
 
def bfs(i, j):
    q = deque()
    q.append([i, j])
    union = []
    union.append([i, j])
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n and visited[nx][ny] == 0:  # ํ•œ๋ฒˆ๋„ ๊ฐ„ ์ ์ด ์—†์œผ๋ฉฐ ๋ฒ”์œ„ ๋‚ด์ผ ๋•Œ
                if l <= abs(s[x][y] - s[nx][ny]) <= r:  # ๋‘ ๋„์‹œ์˜ ์ฐจ์ด๊ฐ€ ๋ฒ”์œ„ ๋‚ด ์ผ ๊ฒฝ์šฐ
                    q.append([nx, ny])
                    union.append([nx, ny])  # ์—ฐํ•ฉ์— ์†Œ์†๋˜๋Š” ๋„์‹œ์˜ ์ขŒํ‘œ
                    visited[nx][ny] = 1  # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    return union
 
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
 
n, l, r = map(int, input().split())
s = [list(map(int, input().split())) for _ in range(n)]
cnt = 0
 
while True:
    visited = [[0]*n for _ in range(n)]
    isUnion = False
    for i in range(n):
        for j in range(n):
            if visited[i][j] == 0:
                visited[i][j] = 1  # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
                union = bfs(i, j)  # ๋ฐฉ๋ฌธํ•œ ๋„์‹œ์— ๋Œ€ํ•œ BFS ์‹คํ–‰
                if len(union) > 1:  # ์—ฐํ•ฉ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒฝ์šฐ
                    isUnion = True  # ํ˜„์žฌ ์—ฐํ•ฉ์ด ์žˆ๋Š” ์ƒํƒœ๋ผ๊ณ  ๋ฐ”๊ฟ”์คŒ
                    avg = sum([s[x][y] for x, y in union]) // len(union)
                    for x, y in union:
                        s[x][y] = avg
    if not isUnion:  # ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋Œ์•˜์Œ์—๋„ ์—ฐํ•ฉ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐ˜๋ณต๋ฌธ ํƒˆ์ถœ
        break
    cnt += 1  # ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋ˆ ํ›„ ์ธ๊ตฌ์ด๋™์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ +1
 
print(cnt)

References