๐Ÿ—๏ธ Algorithm/๐ŸŸฉ ๋ฐฑ์ค€

๐ŸŸฉ [๋ฐฑ์ค€] [Python] [BFS/DFS] 10026๋ฒˆ_์ ๋ก์ƒ‰์•ฝ

Dbswnstjd 2022. 11. 17. 00:05

๋ฌธ์ œ

https://www.acmicpc.net/problem/10026

 

10026๋ฒˆ: ์ ๋ก์ƒ‰์•ฝ

์ ๋ก์ƒ‰์•ฝ์€ ๋นจ๊ฐ„์ƒ‰๊ณผ ์ดˆ๋ก์ƒ‰์˜ ์ฐจ์ด๋ฅผ ๊ฑฐ์˜ ๋Š๋ผ์ง€ ๋ชปํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ์ ๋ก์ƒ‰์•ฝ์ธ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ์€ ์•„๋‹Œ ์‚ฌ๋žŒ์ด ๋ณด๋Š” ๊ทธ๋ฆผ๊ณผ๋Š” ์ข€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์นธ์— R(๋นจ๊ฐ•), G(์ดˆ๋ก)

www.acmicpc.net

ํ’€์ด

BFS๋ฅผ ์ด์šฉํ•œ ํ’€์ด

# ๋ฐฑ์ค€ 10026๋ฒˆ ๋ฌธ์ œ - ์ ๋ก์ƒ‰์•ฝ
from collections import deque
dx, dy = [0,0,-1,1], [1,-1,0,0]
n = int(input())
graph = []
for _ in range(n):
    graph.append(list(map(str, input())))
answer = 0

def bfs(x, y):
    queue = deque()
    queue.append((x,y))
    visited[x][y] = 1
    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            # ์ธ๋ฑ์Šค ๋ฒ”์œ„ ์•ˆ์— ์žˆ์œผ๋ฉด์„œ, ๊ฐ™์€ ์ƒ‰์ด๋ฉด์„œ, ๋ฐฉ๋ฌธ ์•ˆํ•œ ๊ฒฝ์šฐ
            if 0<=nx<n and 0<=ny<n and graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
                visited[nx][ny] = 1
                queue.append((nx, ny))

# ์ ๋ก์ƒ‰๋งน์ด ์•„๋‹Œ ์‚ฌ๋žŒ
visited = [[0]*(n) for _ in range(n)]
answer1 = 0
for i in range(n):
    for j in range(n):
        if visited[i][j] == 0:
            bfs(i,j)
            answer1 += 1
            

# ์ ๋ก์ƒ‰๋งน์ธ ์‚ฌ๋žŒ
visited = [[0]*(n) for _ in range(n)]
answer2 = 0 
for i in range(n):
    for j in range(n):
        if graph[i][j] == 'G':
            graph[i][j] = 'R'
for i in range(n):
    for j in range(n):
        if visited[i][j] == 0:
            bfs(i, j)
            answer2 += 1
print(answer1, answer2)

 

DFS๋ฅผ ์ด์šฉํ•œ ํ’€์ด

# DFS
from collections import deque
import sys
sys.setrecursionlimit(1000000)
dx, dy = [0,0,-1,1], [1,-1,0,0]
n = int(input())
graph = [list(map(str, input())) for _ in range(n)]

def dfs(x, y):
    visited[x][y] = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<= nx < n and 0 <= ny < n and graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
            dfs(nx,ny)
# ์ ๋ก์ƒ‰๋งน์ด ์•„๋‹Œ ๊ฒฝ์šฐ
visited = [[0]*(n) for _ in range(n)]
answer1 = 0
for i in range(n):
    for j in range(n):
        if visited[i][j] == 0:
            dfs(i,j)
            answer1 += 1

# ์ ๋ก์ƒ‰๋งน์ธ ๊ฒฝ์šฐ
visited = [[0]*(n) for _ in range(n)]
answer2 = 0 
for i in range(n):
    for j in range(n):
        if graph[i][j] == 'G':
            graph[i][j] = 'R'
for i in range(n):
    for j in range(n):
        if visited[i][j] == 0:
            answer2 += 1
            dfs(i,j)
print(answer1, answer2)