๐ ๋ฐฑ์ค 1303 - ์ ์ - ์ ํฌ
๐ก ๋์ ํ์ด
(์ฌ๋ด์ด์ง๋ง 1303 ํ๋๊น ๊ตญ๋ฐฉ ํฌํ์ฝ์ด ์๊ฐ๋ฌ๋ค.)
2์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์๊น์ ๋ง๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์ ํ์ ์ธ BFS
๋ฌธ์ ์ด์ง๋ง, ํท๊ฐ๋ฆฐ ๋ถ๋ถ๋ค์ด ๋ง์๋ค. ํ์ชฝ BFS
๋ง ๊ตฌํ๋๊ฒ์ด ์๋๊ณ ์์ชฝ BFS
๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผํ๋ค๋ณด๋๊น ํจ์๋ฅผ ์ด๋ป๊ฒ ์ ์ธํ๋์ง ๊ต์ฅํ ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก BFS
ํจ์์ color
๋ผ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์์ฑํด์ ๋๊ฒจ์คฌ๊ณ ํจ์๋ด์์ ๊ฐ ์นธ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๊ฐ ์๊น๋ณ๋ก w_cnt
, b_cnt
๋ฅผ ๋ฐ๋ก๋ฐ๋ก ์ ์ธํ์ง ์๊ณ cnt
๋ณ์ ํ๋๋ง ์ ์ธํด์ ์๊น ๋ณ๋ก ์กฐ๊ฑด๋ฌธ์ ๋ค๋ฅด๊ฒ ์ฃผ์ด ํ์ฌ ๋ค์ด์จ ์์ ๊ธฐ์ค์ผ๋ก cnt
๋ฅผ ์ธ๊ณ return
ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์งํํ๋ค.
์ด ๋ฐฉ๋ฒ๊น์ง ์บ์นํ๋๋ฐ ์๋นํ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค. ์ด์ ์ฒซ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ก ์ ์ ํ์ผ๋, ๋น์์๋ ํ์ง ๋ชปํ๊ณ ์ดํ ์๋ฒฝํ๊ฒ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋จธ๋ฆฟ์์ ๋ฃ๊ณ ์ถ์ด ์ค๋ 21์๊น์ง ๋ฏธ๋ค๋๋ค๊ฐ ๋ค์ ํ์๋ค.
BFS
์ ๊ตฌํ๋ฐฉ๋ฒ์ ์๋๋ผ๋ ๋ฌธ์ ์ ์ ํ์ ๋ฐ๋ผ์ ์
๋ ฅ๊ฐ์ ๋ค๋ฅด๊ฒ ์ค์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ ์ง๊ธ๊น์ง ๋ด๊ฐ ํ์๋ ์ ํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ ์์ ์ธ BFS ๊ตฌํ: boj_1260 - DFS์ BFS
- ๊ฐ๊ฐ์ ๊ธฐ์ค์ ๋ณ ๊ฑฐ๋ฆฌ๊ณ์ฐ: boj_2667 - ๋จ์ง๋ฒํธ๋ถ์ด๊ธฐ, boj_1303 - ์ ์ - ์ ํฌ
- ์์ ์ง์ ์ด 2๊ณณ ์ด์์ธ ์ขํ๋ฅผ ๋์์ BFS ๊ตฌํ: boj_7576 - ํ ๋งํ
- ํ ๊ธฐ์ค์ ์ด ๋ค๋ฅธ ๊ธฐ์ค์ ์ ์ํฅ์ ๋ฏธ์น๋ BFS: boj_4179 - ๋ถ!
- ๋ฒ์๋ณ ์ต๋ BFS ๊ตฌํ๊ธฐ: boj_2468 - ์์ ์์ญ
- ๋ฑ๋ฑ...
๋ง์ด ํ์ง๋ ๋ชปํ์ง๋ง ์ด๋ค ๋ฌธ์ ๋ ํ์๋ ๋ฌธ์ ๊ฐ๊ณ ๋ฐ๋๋ก ์ด๋ค ๋น์ทํ ๋ฌธ์ ๋ ๋ฐฉ๋ฒ์ ์์ ํ ๋ค๋ฅด๊ฒ ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ง์๋ค. ํ๋ฆ์ ์๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ BFS
๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์์ฒญ๋ง์๋ค. ์ฒ ๋ณด๋ฉด ์ด๋ฐ ์ ํ์ด๊ตฌ๋๋ฅผ ์ ๋๊น์ง ํ์ด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
ํ์ด ๋ฐฉ๋ฒ์ ์ดํด๋ณด์.
- ๋ฐฉ๋ฌธ ๊ธฐ๋ก์ด ์๊ณ ํ์ฌ ๊ฐ์ด
W
์ธ ๊ฐ ํน์ ๋ฐฉ๋ฌธ๊ธฐ๋ก์ด ์๊ณ ํ์ฌ ๊ฐ์ดB
์ธ ๊ฐ์ ํจ์๋ก ๋ฃ์ด์ค๋ค. color
๋ณ๋กcnt
๋ฅผ ์ฆ๊ฐ์ํจ๋ค.return cnt+1
ํ ๊ฐ์ ์ ๊ณฑํด์ฃผ๊ณ ์๊น๋ณ๋ก ๋์ ์ํจ๋ค.
import sys
from collections import deque
input = sys.stdin.readline
def bfs(x, y, color):
cnt = 0
queue = deque()
queue.append((x, y))
visited[x][y] = True
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < m and 0 <= ny < n:
if graph[nx][ny] == color and not visited[nx][ny]: # each color check
visited[nx][ny] = True
queue.append((nx, ny))
cnt += 1 # each color count
return cnt + 1
dx = [1, 0, -1, 0]
dy = [0, 1, 0, -1]
n, m = map(int, input().split())
graph = [list(input()) for _ in range(m)]
visited = [[False] * n for i in range(m)]
white, blue = 0, 0
for i in range(m):
for j in range(n):
if graph[i][j] == 'W' and not visited[i][j]:
white += bfs(i, j, 'W') ** 2 # count accumulate
elif graph[i][j] == 'B' and not visited[i][j] :
blue += bfs(i, j, 'B') ** 2 # count accumulate
print(white, blue)
'Algorithm > ๋ฐฑ์ค(BOJ)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 4179 - ๋ถ! (BFS) (9) | 2021.04.22 |
---|---|
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 1743 - ์์๋ฌผํผํ๊ธฐ (BFS) (0) | 2021.04.22 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 4963 - ์ฌ์ ๊ฐ์(DFS) (0) | 2021.04.20 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 4963 - ์ฌ์ ๊ฐ์(BFS) (0) | 2021.04.20 |
[ ํ์ด์ฌ(python) ] ๋ฐฑ์ค 7576 - ํ ๋งํ (BFS) (0) | 2021.04.20 |
๋๊ธ