😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 16234_인ꡬ 이동 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 16234_인ꡬ 이동

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 10. 14. 17:02
728x90
λ°˜μ‘ν˜•
N×N크기의 땅이 있고, 땅은 1×1개의 칸으둜 λ‚˜λˆ„μ–΄μ Έ μžˆλ‹€.
각각의 λ•…μ—λŠ” λ‚˜λΌκ°€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•˜λ©°, rν–‰ c열에 μžˆλŠ” λ‚˜λΌμ—λŠ” A[r][c]λͺ…이 μ‚΄κ³  μžˆλ‹€
 μΈμ ‘ν•œ λ‚˜λΌ μ‚¬μ΄μ—λŠ” ꡭ경선이 μ‘΄μž¬ν•œλ‹€.
λͺ¨λ“  λ‚˜λΌλŠ” 1×1 크기이기 λ•Œλ¬Έμ—, λͺ¨λ“  ꡭ경선은 μ •μ‚¬κ°ν˜• ν˜•νƒœμ΄λ‹€.

인ꡬ 이동은 ν•˜λ£¨ λ™μ•ˆ λ‹€μŒκ³Ό 같이 μ§„ν–‰λ˜κ³ ,
더 이상 μ•„λž˜ 방법에 μ˜ν•΄ 인ꡬ 이동이 없을 λ•ŒκΉŒμ§€ μ§€μ†λœλ‹€.
    ꡭ경선을 κ³΅μœ ν•˜λŠ” 두 λ‚˜λΌμ˜ 인ꡬ 차이가 Lλͺ… 이상, Rλͺ… μ΄ν•˜λΌλ©΄,
        두 λ‚˜λΌκ°€ κ³΅μœ ν•˜λŠ” ꡭ경선을 였늘 ν•˜λ£¨ λ™μ•ˆ μ—°λ‹€.
    μœ„μ˜ 쑰건에 μ˜ν•΄ μ—΄μ–΄μ•Όν•˜λŠ” ꡭ경선이 λͺ¨λ‘ μ—΄λ Έλ‹€λ©΄, 인ꡬ 이동을 μ‹œμž‘ν•œλ‹€
    ꡭ경선이 μ—΄λ €μžˆμ–΄ μΈμ ‘ν•œ μΉΈλ§Œμ„ μ΄μš©ν•΄ 이동할 수 있으면,
        κ·Έ λ‚˜λΌλ₯Ό 였늘 ν•˜λ£¨ λ™μ•ˆμ€ 연합이라고 ν•œλ‹€.
    연합을 이루고 μžˆλŠ” 각 칸의 μΈκ΅¬μˆ˜λŠ” (μ—°ν•©μ˜ 인ꡬ수) / (연합을 이루고 μžˆλŠ” 칸의 개수)
        νŽΈμ˜μƒ μ†Œμˆ˜μ μ€ 버린닀.
    연합을 ν•΄μ²΄ν•˜κ³ , λͺ¨λ“  ꡭ경선을 λ‹«λŠ”λ‹€.

각 λ‚˜λΌμ˜ μΈκ΅¬μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 인ꡬ 이동이 λ©°μΉ  λ™μ•ˆ λ°œμƒν•˜λŠ”μ§€ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±

첫째 쀄에 N, L, R이 주어진닀. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100)
λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 각 λ‚˜λΌμ˜ μΈκ΅¬μˆ˜κ°€ 주어진닀.
    rν–‰ c열에 μ£Όμ–΄μ§€λŠ” μ •μˆ˜λŠ” A[r][c]의 값이닀. (0 ≤ A[r][c] ≤ 100)
인ꡬ 이동이 λ°œμƒν•˜λŠ” μΌμˆ˜κ°€ 2,000번 보닀 μž‘κ±°λ‚˜ 같은 μž…λ ₯만 주어진닀.

인ꡬ 이동이 λ©°μΉ  λ™μ•ˆ λ°œμƒν•˜λŠ”μ§€ 첫째 쀄에 좜λ ₯ν•œλ‹€.
# 1) BFS
# : BFS 탐색을 ν• λ•Œλ§ˆλ‹€ 연합에 κ°€μž…ν•  λ‚˜λΌμ˜ μ’Œν‘œλ₯Ό λ‹΄λŠ”λ‹€

from collections import deque

def bfs(a, b, graph, visit) :
    # μ—°ν•© κ΅­κ°€
    unit = []
    people = 0

    q = deque()
    q.append((a, b))            # μ’Œν‘œ 기둝
    unit.append((a, b))
    visited[a][b] = True        # λ°©λ¬Έ
    people += graph[a][b]       # λ‚˜λΌ 인ꡬ수 ν•©

    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 not visited[nx][ny] :
                # Lλͺ… 이상, Rλͺ… μ΄ν•˜ => μ—°ν•©
                if L <= abs(graph[nx][ny] - graph[x][y]) <= R :
                    q.append((nx, ny))
                    unit.append((nx, ny))
                    people += graph[nx][ny]
                    visited[nx][ny] = True
    #  각 칸의 μΈκ΅¬μˆ˜λŠ” (μ—°ν•©μ˜ 인ꡬ수) / (연합을 이루고 μžˆλŠ” 칸의 개수)
    new_people = people // len(unit)

    for a, b in unit :
        graph[a][b] = new_people
    
    return True if len(unit) >= 2 else False

# N개의 쀄, 두 λ‚˜λΌμ˜ 인ꡬ 차이가 Lλͺ… 이상, Rλͺ… μ΄ν•˜
N, L, R = map(int, input().split())

graph = []
for i in range(N) :
    graph.append(list(map(int, input().split())))

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

day = 0
while True :
    visited = [[False] * N for _ in range(N)]
    stop = True         # True 이면 while 끝

    for i in range(N) :
        for j in range(N) :
            if not visited[i][j] :
                check = bfs(i, j, graph, visited)
                if check :
                    stop = False

    if stop :
        break
    else :
        day += 1

print(day)
728x90
λ°˜μ‘ν˜•
Comments