๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 16724 ํ”ผ๋ฆฌ ๋ถ€๋Š” ์‚ฌ๋‚˜์ด (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2022. 10. 2.

<๋ฌธ์ œ ๋งํฌ>

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. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ํ’€์ด

  1. ์ฃผ์–ด์ง„ ๊ทธ๋ž˜ํ”„์—์„œ dfs๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์ดํด์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์‚ฌ์ดํด์„ ํ•˜๋‚˜์˜ safezone ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด์•ผํ•˜๋Š”๋ฐ ์ด ๊ณผ์ •์—์„œ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์–ด์ฐจํ”ผ ์ด๋™๋ฐฉํ–ฅ์ด ์ฃผ์–ด์ ธ์žˆ์œผ๋ฏ€๋กœ dfs๋ฅผ ์ด์šฉํ•ด ๊ฒฝ๋กœ๋Œ€๋กœ ์ญ‰ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์˜์—ญ์ด ๋“ฑ์žฅํ•˜๋ฉด(base condition) ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ unionํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ unionํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  3. safezone์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋„˜๋ฒ„๋ง์„ ํ•ด์•ผํ•˜๋ฏ€๋กœ find ํ•จ์ˆ˜ ์ž‘์„ฑ ์‹œ ๊ผญ ๊ฒฝ๋กœ ์••์ถ•์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

2. BFS ํ’€์ด

  1. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋™๋ฐฉํ–ฅ์ด ์ฃผ์–ด์ ธ์žˆ์œผ๋ฏ€๋กœ bfs๋ฅผ ํ†ตํ•ด์„œ ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ์— ์„ธ์ดํ”„์กด์„ ๋„˜๋ฒ„๋ง ํ•ด์ฃผ๋ฉด์„œ ํƒ์ƒ‰์„ ํ•˜๋ฉด ๋œ๋‹ค.
  2. ๋‹จ ์ค‘์š”ํ•œ ์ ์€, ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์ฃผ์–ด์ง„ ๊ฒฝ๋กœ๋Œ€๋กœ ๋‚˜์•„๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด 'ํ˜„์žฌ ์˜์—ญ์—์„œ ๋‹ค์Œ ์˜์—ญ์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ๋กœ'๋งŒ ํ™•์ธํ•˜๊ณ  '๋‹ค๋ฅธ ์˜์—ญ์—์„œ ํ˜„์žฌ ์˜์—ญ์œผ๋กœ ์ ‘๊ทผํ•ด์˜ค๋Š” ๊ฒฝ๋กœ'๋Š” ์ œ๋Œ€๋กœ ํ™•์ธํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ถ€๋ถ„์„ ์‹ ๊ฒฝ ์จ์ค˜์•ผ ํ•œ๋‹ค.

<์ •๋‹ต ์ฝ”๋“œ - ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ>

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)

๋Œ“๊ธ€