ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [DFS/BFS] BOJ 16234 ์ธ๊ตฌ ์ด๋™
    Algorithms in Python/baekjoon 2021. 2. 1. 09:27

     

    ๐ŸŽˆ ๋ฐฑ์ค€ 16234 ์ธ๊ตฌ ์ด๋™

    www.acmicpc.net/problem/16234

     

    16234๋ฒˆ: ์ธ๊ตฌ ์ด๋™

    N×Nํฌ๊ธฐ์˜ ๋•…์ด ์žˆ๊ณ , ๋•…์€ 1×1๊ฐœ์˜ ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ๋•…์—๋Š” ๋‚˜๋ผ๊ฐ€ ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋ฉฐ, rํ–‰ c์—ด์— ์žˆ๋Š” ๋‚˜๋ผ์—๋Š” A[r][c]๋ช…์ด ์‚ด๊ณ  ์žˆ๋‹ค. ์ธ์ ‘ํ•œ ๋‚˜๋ผ ์‚ฌ์ด์—๋Š” ๊ตญ๊ฒฝ์„ ์ด ์กด์žฌํ•œ๋‹ค. ๋ชจ

    www.acmicpc.net

     

    โ— ๋ฌธ์ œ์˜ ํ•ต์‹ฌ, ํ’€์ด ๊ณผ์ •

    • ์ธ๊ตฌ ์ด๋™์€ ๋” ์ด์ƒ ์ธ๊ตฌ ์ด๋™์ด ์—†์„ ๋•Œ๊นŒ์ง€ ์ง€์†๋œ๋‹ค.

    => ์ธ๊ตฌ ์ด๋™์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ฒดํฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

     

    ๊ตญ๊ฒฝ์„ ์„ ๊ณต์œ ํ•˜๋Š” ๋‘ ๋‚˜๋ผ์˜ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L๋ช… ์ด์ƒ, R๋ช… ์ดํ•˜๋ผ๋ฉด, ๋‘ ๋‚˜๋ผ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์„ ์˜ค๋Š˜ ํ•˜๋ฃจ๋™์•ˆ ์—ฐ๋‹ค.

    ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ตญ๊ฒฝ์„ ์ด ๋ชจ๋‘ ์—ด๋ ธ๋‹ค๋ฉด, ์ธ๊ตฌ ์ด๋™์„ ์‹œ์ž‘ํ•œ๋‹ค

    => ์กฐ๊ฑด์ด ๋งŒ์กฑํ•˜๋ฉด ๋ชจ๋‘ ์—ด๊ณ  ํ•˜๋ฃจ ๋™์•ˆ ์ธ๊ตฌ ์ด๋™์€ 1๋ฒˆ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ์ œ5๋ฅผ ๋ณด๋ฉด 6๋ฒˆ ์ด๋™ํ•˜์ง€๋งŒ, ํ•˜๋ฃจ์— ์ด๋™ํ•œ ๊ฒƒ์ด ํ•œ ๋ฒˆ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด 3๋ฒˆ ์ด๋™ํ•œ ๊ฒƒ์ด๋‹ค.

    => ํ•˜๋ฃจ ๋™์•ˆ ๋ชจ๋“  ๋‚˜๋ผ๋ฅผ ํ™•์ธํ•œ ํ›„ ์ธ๊ตฌ ์ด๋™์ด ์žˆ๋Š” ๊ฒฝ์šฐ cnt๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

     

     ๊ตญ๊ฒฝ์„ ์ด ์—ด๋ ค์žˆ์–ด ์ธ์ ‘ํ•œ ์นธ๋งŒ์„ ์ด์šฉํ•ด ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด, ๊ทธ ๋‚˜๋ผ๋ฅผ ์˜ค๋Š˜ ํ•˜๋ฃจ ๋™์•ˆ์€ ์—ฐํ•ฉ์ด๋ผ๊ณ  ํ•œ๋‹ค.

    ์ธ๊ตฌ ์ด๋™์ด ๋๋‚˜๋ฉด, ์—ฐํ•ฉ์„ ํ•ด์ฒดํ•˜๊ณ , ๋ชจ๋“  ๊ตญ๊ฒฝ์„ ์„ ๋‹ซ๋Š”๋‹ค.

    => ๊ฒฐ์„ฑ๋œ ์—ฐํ•ฉ์ด ์ธ๊ตฌ ์ด๋™์„ ํ•  ๋•Œ, ์˜ค๋Š˜ ๊ฒฐ์„ฑ๋œ ๋‹ค๋ฅธ ์—ฐํ•ฉ์˜ ๋ฐ”๋€ ์ธ๊ตฌ์™€ ๋•…์„ ๊ณ ๋ คํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฐํ•ฉ์ธ์ง€ ์ฒดํฌํ•˜๋Š” boolean ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

         - ํ•˜๋ฃจ๋งˆ๋‹ค ์ดˆ๊ธฐํ™” ๋˜์–ด์•ผ ํ•จ์œผ๋กœ while ์•ˆ์— ์„ ์–ธํ•œ๋‹ค.

         - ํ•œ ๋‚˜๋ผ์˜ ์ธ์ ‘ ๋‚˜๋ผ ์ค‘ ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ L๋ช… ์ด์ƒ, R๋ช… ์ดํ•˜์ธ ๋‚˜๋ผ๊ฐ€ ์—†์œผ๋ฉด ๊ทธ ๋‚˜๋ผ๋ฅผ ํ•˜๋‚˜์˜ ์—ฐํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด ํ•˜๋ฃจ์—๋Š” ๋”์ด์ƒ ์ด ๋‚˜๋ผ๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

    => ์—ฐํ•ฉ์ด ์•„๋‹Œ ๋‚˜๋ผ๋ฅผ bfsํ•˜์—ฌ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜๋ฉด ์—ฐํ•ฉ์œผ๋กœ ์ถ”๊ฐ€ํ•œ๋‹ค.

     

     ์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ๊ฐ ์นธ์˜ ์ธ๊ตฌ์ˆ˜๋Š” (์—ฐํ•ฉ์˜ ์ธ๊ตฌ์ˆ˜) / (์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜)๊ฐ€ ๋œ๋‹ค. 

    => ์—ฐํ•ฉ์— ์ถ”๊ฐ€ํ• ๋•Œ ๊ทธ ๋‚˜๋ผ์˜ ์ธ๊ตฌ์ˆ˜์™€ ์นธ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ทธ ๋•…์˜ index๋ฅผ ์ €์žฅํ•  land_idx ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ์ €์žฅํ•œ๋‹ค.

     

    * ์ฆ‰ ํ•˜๋ฃจ์˜ ์—ฐํ•ฉ์„ ์ฒดํฌํ•˜๋Š” union boolean ๋ฐฐ์—ด์€ ๋‘ ๋‚˜๋ผ ์ด์ƒ์ด ์—ฐํ•ฉ์ผ ๋•Œ ๊ทธ ๋‚˜๋ผ๋“ค์— True ๊ฐ’, ํ˜น์€ ์ฃผ๋ณ€ ๋‚˜๋ผ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ์•Š์•„ ๊ทธ ์ž์ฒด๋ฅผ ์—ฐํ•ฉ์œผ๋กœ ์น˜๋Š” ํ•œ ๋‚˜๋ผ์— True๊ฐ’์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

    * ํ•œ ๋‚˜๋ผ๋ฅผ ์—ฐํ•ฉ์œผ๋กœ ์น˜๋Š” ์—ฐํ•ฉ์˜ ๋ฐฐ์—ด๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ณ , ํ•˜๋ฃจ์— ๊ณ ๋ ค๊ฐ€ ๋๋‚œ ๋‚˜๋ผ๋ฅผ True๋กœ ๋งŒ๋“œ๋Š” ๋ฐฐ์—ด์ด๋ผ๊ณ  ์ƒ๊ฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.   

     

    โœ… ์ „์ฒด ์ฝ”๋“œ

    import sys
    from collections import deque
    input = sys.stdin.readline
    
    def bfs(x, y):
        land_idx = []   # ์ธ๊ตฌ ์ด๋™ํ•  ๋•…์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ
        move = False    # ์ธ๊ตฌ ์ด๋™ ๋ฐœ์ƒ ํ–ˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” boolean
    
        land_idx.append((x, y))
        queue = deque()
        queue.append((x, y))
        union[x][y] = True
        people = A[x][y]    # ์—ฐํ•ฉ ์ธ๊ตฌ์ˆ˜
        land = 1            # ์—ฐํ•ฉ์„ ์ด๋ฃจ๊ณ  ์žˆ๋Š” ์นธ์˜ ๊ฐœ์ˆ˜
    
        # bfs
        while queue:
            x, y = queue.popleft()
            # ํ˜„์žฌ ์œ„์น˜์—์„œ ์ƒํ•˜์ขŒ์šฐ ์ธ์ ‘ ๋‚˜๋ผ ํ™•์ธ
            for i in range(4):
                nx = x + dx[i]
                ny = y + dy[i]
    
                if nx < 0 or nx >= n or ny < 0 or ny >= n:
                    continue
    
                dif = abs(A[x][y] - A[nx][ny])  # ์ธ๊ตฌ ์ฐจ์ด ๊ณ„์‚ฐ
                # ์ธ๊ตฌ ์ฐจ์ด๊ฐ€ l๊ณผ r ์‚ฌ์ด๊ณ  ๋‹ค๋ฅธ ์—ฐํ•ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด
                if l <= dif <= r and not union[nx][ny]:
                    # ์—ฐํ•ฉ์— ์ถ”๊ฐ€
                    union[nx][ny] = True
                    queue.append((nx, ny))
                    people += A[nx][ny]
                    land += 1
                    land_idx.append((nx, ny))
                    move = True #์ธ๊ตฌ ์ด๋™ ์ฒดํฌ
    
        # ์ธ๊ตฌ ์ด๋™์ด ์—†๋Š” ๊ฒฝ์šฐ False ๋ฆฌํ„ด
        if not move:
            return move
    
        # ์—ฐํ•ฉ ์ธ๊ตฌ ์ด๋™
        change = people // land
        for x, y in land_idx:
            A[x][y] = change
        # ์ธ๊ตฌ ์ด๋™์ด ์žˆ๋Š” ๊ฒฝ์šฐ True ๋ฆฌํ„ด
        return move
    
    n, l, r = map(int, input().split())
    A = [[0] * n for _ in range(n)]
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    
    for i in range(n):
        A[i] = list(map(int, input().split()))
    
    cnt = 0     # ์ธ๊ตฌ ์ด๋™ ํšŸ์ˆ˜
    # ๋” ์ด์ƒ ์ธ๊ตฌ ์ด๋™์ด ์—†์„ ๋•Œ๊นŒ์ง€ ์ง€์†ํ•œ๋‹ค.
    while True:
        flag = True     # ์ธ๊ตฌ ์ด๋™์ด ์—†๋Š” ๊ฒฝ์šฐ
        union = [[False] * n for _ in range(n)] # ์—ฐํ•ฉ, ๊ณ ๋ คํ•œ ๋‚˜๋ผ์ธ์ง€ ์ฒดํฌํ•  ๋ฆฌ์ŠคํŠธ
    
        for i in range(n):
            for j in range(n):
                # ์—ฐํ•ฉ์ด ์•„๋‹Œ ๊ฒฝ์šฐ(๊ณ ๋ คํ•˜์ง€ ์•Š์€ ๋‚˜๋ผ์ธ ๊ฒฝ์šฐ) bfs์ง„ํ–‰
                if not union[i][j]:
                    if bfs(i, j):
                        flag = False    # ์ธ๊ตฌ ์ด๋™ check
    
        # ํ•˜๋ฃจ ๋™์•ˆ ์ธ๊ตฌ ์ด๋™์ด ์—†๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒ
        if flag:
            break
        # ํ•˜๋ฃจ ๋™์•ˆ ์ธ๊ตฌ ์ด๋™์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ฆ๊ฐ€
        else:
            cnt += 1
    print(cnt)

     

    "ํ•˜๋ฃจ" ๋ผ๋Š” ์กฐ๊ฑด์ด ๊นŒ๋‹ค๋กœ์› ๋‹ค. ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๊ผผ๊ผผํžˆ ์ฝ์—ˆ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

    ๋Œ“๊ธ€

Designed by Tistory.