Point ๐Ÿ’ก


  1. bfs๋กœ ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰ ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ ๋ฝ‘์•„๋‚ด๊ธฐ
  2. ์ธ๊ตฌ ์ˆ˜ ๊ณ„์‚ฐ โ†’ map์— ์ธ๊ตฌ ์ˆ˜ ๋ฐ”๊พธ๊ธฐ
  3. ๋‹ค์‹œ ๋ฐ˜๋ณต๋ฌธ ๋Œ๋‹ค๊ฐ€ ๋งŒ์•ฝ, bfs๋กœ ๋‹ค ๋Œ์•˜๋Š”๋ฐ, ์ธ๋ฑ์Šค ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๊ฐ€ ์—†์œผ๋ฉด break

โ†’ ๋ช‡๊ฐœ test ์‹คํŒจ โ—๏ธ

Why ?

My Solution


import sys
from collections import deque

N, L, R = map(int,sys.stdin.readline().split())
countries = []
for _ in range(N):
    countries.append(list(map(int, sys.stdin.readline().split())))

dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]

def bfs(x,y):
    # ์ „์—ญ์— visited ์„ ์–ธ -> ์—ฌ๊ธฐ์„œ ์„ ์–ธ์•ˆํ•ด๋„๋จ
    queue = deque()
    idx_list = []
    queue.append((x, y))
    idx_list.append((x, y))

    while queue:
        cur_x, cur_y = queue.popleft()

        for i in range(4):
            nx, ny = cur_x + dx[i], cur_y + dy[i]
            if 0 <= nx < N and 0 <= ny < N and visited[nx][ny] == 0:
                if L <= abs(countries[cur_x][cur_y] - countries[nx][ny]) <= R:
                    visited[nx][ny] = 1
                    queue.append((nx, ny))
                    idx_list.append((nx, ny))

    return idx_list

answer = 0
while True:
    visited = [[0] * (N) for _ in range(N)]
    flag = False

    for i in range(N):
        for j in range(N):
            # ์œ ๊ธฐ๋† ๋ฐฐ์ถ”์ฒ˜๋Ÿผ ๋ถ€๋ถ„ ์ง‘๋‹จ์ด ๋ช‡๊ฐœ์”ฉ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•˜๋‚˜์”ฉ bfs ํ•ด์ค˜์•ผํ•จ
            if visited[i][j] == 0:
                visited[i][j] = 1

                groups = bfs(i, j)
                groups_length = len(groups)

                # ๊ตญ๊ฐ€ ํ•˜๋‚˜๋งŒ ๋‚˜์˜ค๋ฉด ์—ฐํ•ฉ์ด ์•ˆ๋œ ๊ฒƒ
                if groups_length > 1:
                    flag = True
                    people_cnt = sum([countries[x][y] for x, y in groups]) // groups_length

                    for x, y in groups:
                        countries[x][y] = people_cnt

    # ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค ๋Œ๋ ธ๋Š”๋ฐ flag๊ฐ€ False์ด๋ฉด ๋”์ด์ƒ ์ธ๊ตฌ์ด๋™ ๋ถˆ๊ฐ€๋Šฅ
    if not flag:
        break

    answer += 1

print(answer)