<๋ฌธ์ ๋งํฌ>
https://www.acmicpc.net/problem/16724
16724๋ฒ: ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด
์ฒซ ๋ฒ์งธ ์ค์ ์ง๋์ ํ์ ์๋ฅผ ๋ํ๋ด๋ N(1 ≤ N ≤ 1,000)๊ณผ ์ง๋์ ์ด์ ์๋ฅผ ๋ํ๋ด๋ M(1 ≤ M ≤ 1,000)์ด ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ง๋์ ์ ๋ณด๋ฅผ ๋ํ๋ด๋ ๊ธธ์ด๊ฐ M์ธ ๋ฌธ์์ด์ด ์ฃผ
www.acmicpc.net
<ํ์ด ์ ๋ต>
0. DFS / BFS (+ ์ ๋์จํ์ธ๋) ๋ฌธ์ ์ด๋ค. ์ ๋์จ ํ์ธ๋์ ๊ดํธ๋ฅผ ์น ์ด์ ๋ ์๋ ์ค๋ช ํ๊ฒ ์ง๋ง ์ ๋์จ ํ์ธ๋๋ฅผ ์ ์ฐ๊ณ bfs๋ง์ผ๋ก ํ์ด ํ๋ ๋ฐฉ๋ฒ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. (์๋ ์ค๋ช )
1. ์ ๋์จ ํ์ธ๋ ํ์ด
- ์ฃผ์ด์ง ๊ทธ๋ํ์์ dfs๋ฅผ ํตํด์ ์ฌ์ดํด์ ํ์ธํ๊ณ ํด๋น ์ฌ์ดํด์ ํ๋์ safezone ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผํ๋๋ฐ ์ด ๊ณผ์ ์์ ์ ๋์จ ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ์ด์ฐจํผ ์ด๋๋ฐฉํฅ์ด ์ฃผ์ด์ ธ์์ผ๋ฏ๋ก dfs๋ฅผ ์ด์ฉํด ๊ฒฝ๋ก๋๋ก ์ญ ํ์ํ๋ค๊ฐ ์ด์ ์ ๋ฐฉ๋ฌธํ ์์ญ์ด ๋ฑ์ฅํ๋ฉด(base condition) ๊ฑฐ๊ธฐ์๋ถํฐ unionํจ์๋ฅผ ์ด์ฉํด ์ง๋์จ ๊ฒฝ๋ก๋ฅผ ์ฌ๊ท์ ์ผ๋ก unionํด์ฃผ๋ฉด ๋๋ค.
- safezone์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํด์๋ ๋๋ฒ๋ง์ ํด์ผํ๋ฏ๋ก find ํจ์ ์์ฑ ์ ๊ผญ ๊ฒฝ๋ก ์์ถ์ ํด์ค์ผ ํ๋ค.
2. BFS ํ์ด
- ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋๋ฐฉํฅ์ด ์ฃผ์ด์ ธ์์ผ๋ฏ๋ก bfs๋ฅผ ํตํด์ ์ง๋์จ ๊ฒฝ๋ก์ ์ธ์ดํ์กด์ ๋๋ฒ๋ง ํด์ฃผ๋ฉด์ ํ์์ ํ๋ฉด ๋๋ค.
- ๋จ ์ค์ํ ์ ์, ์ ๋์จํ์ธ๋์๋ ๋ค๋ฅด๊ฒ ์ฃผ์ด์ง ๊ฒฝ๋ก๋๋ก ๋์๊ฐ๊ธฐ๋ง ํ๋ฉด 'ํ์ฌ ์์ญ์์ ๋ค์ ์์ญ์ผ๋ก ๊ฐ๋ ๊ฒฝ๋ก'๋ง ํ์ธํ๊ณ '๋ค๋ฅธ ์์ญ์์ ํ์ฌ ์์ญ์ผ๋ก ์ ๊ทผํด์ค๋ ๊ฒฝ๋ก'๋ ์ ๋๋ก ํ์ธํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ถ๋ถ์ ์ ๊ฒฝ ์จ์ค์ผ ํ๋ค.
<์ ๋ต ์ฝ๋ - ์ ๋์จ ํ์ธ๋>
import sys, os, io, atexit
input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))
# 221001 16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด
# ์ ๋ต์ฝ๋
# directions: ๋ฐฉํฅ ์ ๋ณด ์ ์ฅ
directions = {
'D' : (1, 0),
'U' : (-1, 0),
'L' : (0, -1),
'R' : (0, 1),
}
# dfs๋ฅผ ํตํด safezone ์ฐ๊ฒฐ
def dfs(r, c, r_start, c_start):
# ์ด์ ์ ํ์ํ ๊ณณ์ด๋ฉด
if visited[r][c]:
# ์ ๋์จํ์ธ๋ ํจ์๋ฅผ ํตํด ์ฌ๊ท์ ์ผ๋ก safezone๊ณผ ์ฐ๊ฒฐํด์ค๋ค
merge(r, c, r_start, c_start)
return
# ๋ฐฉ๋ฌธ ํ์
visited[r][c] = 1
# ๋ค์ ํ์ ์ขํ
nr = r + directions[arr[r][c]][0]
nc = c + directions[arr[r][c]][1]
# ์ฌ๊ท์ ์ผ๋ก ํ์
dfs(nr, nc, r_start, c_start)
# ํจ์ basecondition ๋๋ฌ ์ดํ ์ฌ๊ท์ ์ผ๋ก safezone ์ฐ๊ฒฐ
merge(r, c, r_start, c_start)
return
# find ํจ์
def find(x):
if safezone[x] != x:
safezone[x] = find(safezone[x])
return safezone[x]
# union ํจ์
def merge(r_x, c_x, r_y, c_y):
# 2์ฐจ์ ๋ฐฐ์ด์ ์ขํ๋ฅผ 1์ฐจ์ ํํ๋ก ๋ณํ
x = find((r_x * M) + c_x)
y = find((r_y * M) + c_y)
if x < y:
safezone[y] = x
else:
safezone[x] = y
return
# N, M: ๋ฐฐ์ด์ ํฌ๊ธฐ
N, M = map(int, input().split())
# arr: ์ง๋ ๋ฐฐ์ด
arr = [list(input()) for _ in range(N)]
# visited: ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์ ๋ฐฐ์ด
visited = [[0 for _ in range(M)] for _ in range(N)]
# safezone: ์ ๋์จํ์ธ๋ ์งํฉ ํ์ ๋ฐฐ์ด
safezone = [i for i in range(N * M)]
# ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ด ์์ผ๋ฉด dfs๋ฅผ ํตํด์ safezone๊ณผ ์ฐ๊ฒฐํด์ค๋ค.
for r in range(N):
for c in range(M):
if not visited[r][c]:
dfs(r, c, r, c)
# safezone์ ๊ฐ์ ์ถ๋ ฅ
print(len(set(safezone)))
<์ ๋ต์ฝ๋ - BFS>
* ์ถ์ฒ : https://only-jione.tistory.com/
# 16724 ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด
# 220930
'''
์์์๊ฐ 15:20
์ข
๋ฃ์๊ฐ
'''
import sys
input = sys.stdin.readline
from collections import deque
N, M = list(map(int, input().split()))
arr = [list(input()) for _ in range(N)]
arrC = [[0] * M for _ in range(N)]
di = [1, 0, -1, 0]
dj = [0, 1, 0, -1]
dp = ['U', 'L', 'D', 'R']
dn = ['D', 'R', 'U', 'L']
cnt = 0
for i in range(N):
for j in range(M):
if arrC[i][j] == 0:
cnt += 1
pi, pj = i, j
queue = deque()
queue.append([pi, pj])
arrC[pi][pj] = cnt
while queue:
pi, pj = queue.popleft()
for d in range(4):
ni = pi + di[d]
nj = pj + dj[d]
if (0 <= ni < N) and (0 <= nj < M):
# ๋ด ๋ฐฉํฅ์ผ๋ก ์ค๋ ๊ฑฐ or ๋ด๊ฐ ๊ฐ๋ ๊ฑฐ
if arrC[ni][nj] == 0 and (arr[ni][nj] == dp[d] or arr[pi][pj] == dn[d]):
arrC[ni][nj] = cnt
queue.append([ni, nj])
print(cnt)
'โญ Problem_Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 20056 ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (Python/ํ์ด์ฌ) (0) | 2022.10.03 |
---|---|
[๋ฐฑ์ค] 14621 ๋๋ง ์๋๋ ์ฐ์ (Python/ํ์ด์ฌ) (1) | 2022.10.02 |
[๋ฐฑ์ค] 2146 ๋ค๋ฆฌ ๋ง๋ค๊ธฐ (Python/ํ์ด์ฌ) (0) | 2022.10.01 |
[๋ฐฑ์ค] 20055 ์ปจ๋ฒ ์ด์ด ๋ฒจํธ ์์ ๋ก๋ด (Python/ํ์ด์ฌ) (1) | 2022.09.30 |
[๋ฐฑ์ค] 2212 ์ผ์ (Python/ํ์ด์ฌ) (2) | 2022.09.29 |
๋๊ธ