-
[DFS/BFS] BOJ 16234 ์ธ๊ตฌ ์ด๋Algorithms in Python/baekjoon 2021. 2. 1. 09:27
๐ ๋ฐฑ์ค 16234 ์ธ๊ตฌ ์ด๋
โ ๋ฌธ์ ์ ํต์ฌ, ํ์ด ๊ณผ์
• ์ธ๊ตฌ ์ด๋์ ๋ ์ด์ ์ธ๊ตฌ ์ด๋์ด ์์ ๋๊น์ง ์ง์๋๋ค.
=> ์ธ๊ตฌ ์ด๋์ด ์๋์ง ์๋์ง ์ฒดํฌ๊ฐ ํ์ํ๋ค.
• ๊ตญ๊ฒฝ์ ์ ๊ณต์ ํ๋ ๋ ๋๋ผ์ ์ธ๊ตฌ ์ฐจ์ด๊ฐ 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)
"ํ๋ฃจ" ๋ผ๋ ์กฐ๊ฑด์ด ๊น๋ค๋ก์ ๋ค. ๋ฌธ์ ์ ์กฐ๊ฑด์ ๊ผผ๊ผผํ ์ฝ์์ด์ผ ํ๋ ๋ฌธ์ ์๋ค.
'Algorithms in Python > baekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Sliding Window] BOJ 10025 ๊ฒ์ผ๋ฅธ ๋ฐฑ๊ณฐ (0) 2021.02.03 [DFS/BFS] BOJ 18405 ๊ฒฝ์์ ์ ์ผ (0) 2021.02.01 [Binary Search] BOJ 2470 ๋ ์ฉ์ก (0) 2021.01.27 [Binary Search] BOJ 2110 ๊ณต์ ๊ธฐ ์ค์น (0) 2021.01.24 [Backtracking] BOJ 2580 ์ค๋์ฟ (0) 2021.01.19