10026๋ฒ: ์ ๋ก์์ฝ
์ ๋ก์์ฝ์ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ ์ฐจ์ด๋ฅผ ๊ฑฐ์ ๋๋ผ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์, ์ ๋ก์์ฝ์ธ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ์ ์๋ ์ฌ๋์ด ๋ณด๋ ๊ทธ๋ฆผ๊ณผ๋ ์ข ๋ค๋ฅผ ์ ์๋ค. ํฌ๊ธฐ๊ฐ N×N์ธ ๊ทธ๋ฆฌ๋์ ๊ฐ ์นธ์ R(๋นจ๊ฐ), G(์ด๋ก)
www.acmicpc.net
์ค๋ช

์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํฌ๊ธฐ๊ฐ 5x5์ธ ๊ทธ๋ฆฌ๋๊ฐ ์ฃผ์ด์ก๋ค๊ณ ํ์. R์ ๋นจ๊ฐ์, B๋ ํ๋์, G๋ ์ด๋ก์์ ๋ํ๋ธ ๊ฒ์ด๋ค. ๊ฐ์ ์๋ผ๋ฆฌ ์ธ์ ํด ์์ผ๋ฉด ๊ทธ๊ฑด ํ๋์ ๊ตฌ์ญ์ด๋ค. ์ด ๋ฌธ์ ๋ ์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ์ ์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ๋ก ๋๋ ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ๋ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ ๊ตฌ๋ถํ์ง ๋ชปํด์ ๊ฐ์ ์์ผ๋ก ๋ณด์ผ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ๊ตฌ์ญ์ ๊ตฌํด๋ณด์. ์๋๋ ๊ตฌ์ญ์ ์๊น๋ณ๋ก ๊ตฌ๋ถํด์ ๊ตฌ์ญ์ ๋ํ๋ธ ๊ฒ์ด๋ค.

๊ทธ๋ฆฌ๋ ์์ ๊ฒ์์ ์ ์ ๊ตฌ์ญ์ ๋๋ ๊ฒ์ ๋ํ๋ธ ๊ฒ์ด๋ค. ์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด ๊ตฌ์ญ์ด ์ด 4๊ฐ(๋นจ2, ์ด1, ํ1)๋ก๋๋ ์ง ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ๋ ๋นจ๊ฐ์๊ณผ ์ด๋ก์์ด ๊ตฌ๋ถ์ด ์์ด์ ธ์ ๊ตฌ์ญ์ด ์ด 3๊ฐ(๋นจ2, ํ1)๋ก ๋๋ ์ง ๊ฒ์ ๋ณผ ์ ์๋ค. (ํ์๋ ์ด๋ก์์ ๋นจ๊ฐ์์ผ๋ก ์น ํ๋ค.)
ํ์ด
โ BFS/DFS ์๊ณ ๋ฆฌ์ฆ ์ด์ฉ
1. ํ์ด์ฌ์์ BFS/DFS๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ํ/์คํ์ด ํ์ํ๋ค. ํ์ ์คํ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๋ ๋ฑ์ ๊ฐ์ ธ์จ๋ค.
from collections import deque
import sys
input = sys.stdin.readline #์
์ถ๋ ฅ ํฅ์
2. ๊ทธ๋ฆฌ๋๋ฅผ ํ์ํ ๋ ์ง๋๊ฐ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํ ๋ณ์ dx, dy ์์ฑ
์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ๊ธฐ ์ ์ ํ์ํ ๋ณ์๊ฐ ์๋ค. (ํจ์ ๋ด์์ ํด๋ ๋์ง๋ง ํธ์์ ๋จผ์ ์ ์)

๋ง์ฝ 3x3 ๋ฏธ๋ก(์ข์ธก ๊ทธ๋ฆผ)๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์. (0, 0)์์ ์ง๋๊ฐ ์ ์๋ ๊ธธ์ธ์ง ํ์ธํ๊ธฐ ์ํด์๋ ํ์ฌ์์น์์ ์ฃผ๋ณ์ ๋ค ํ์ธํด๋ด์ผ ํ๋๋ฐ, ๋ฌธ์ ์์ ์ธ์ ํ ์นธ์ผ๋ก๋ง ์ด๋ํ ์ ์๋ค๊ณ ํ์ผ๋ฏ๋ก ๋๊ฐ์ ์ ์ ์ธํ ์ํ์ข์ฐ๋ง ํ์ธํด๋ณด๋ฉด ๋๋ค.
ํ์ธํ๋ ๋ฐฉ๋ฒ์ ํ์ฌ ์์น์์ ๋ค๋ฅธ ์์น๋ก ์ด๋ํ๋ฉด์ ํด์ผ ํ๋ค. ์ํ์ข์ฐ 4๊ฐ์ ๋ฐ์ดํฐ๋ง ํ์ํ๋ฏ๋ก x, y ๋ณ์์ ๊ฐ ๋ค ๊ฐ์ ๊ฐ๋ง ๋ฃ๋๋ค. ๋งจ ์ฐ์ธก์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ขํ๋ก ๋ํ๋ธ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ, ์ด๋ ํ์ฌ ์์น์์ ํ ์นธ์ ์ด๋ํ์ ๋์ ์ขํ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค. ๊ทธ๋ผ dx์ x์ขํ๋ง ์ ์ฅํ๋ฉด ๋๋ฏ๋ก [(์ข)-1, (์ฐ)1, (์)0, (ํ)0], ๊ทธ๋ฆฌ๊ณ dy์๋ y์ขํ์ธ [(์ข)0, (์ฐ)0, (์)1 (ํ)-1] ์ด๋ ๊ฒ ์ ์ฅํ๋ค. ํ์๋ ์ข์ฐํ์ ์๋๋ก ์ ์ฅํ์ง๋ง, ๋ณธ์ธ์ด ํธํ ์์๋๋ก ์ ์ฅํ๋ฉด ๋๋ค. (๋จ x์ y ๋ชจ๋ ์์์ ๋ง๊ฒ ์ ์ฅํด์ผ ํ๋ค. ์ฆ, x๋ ์ข์ฐํ์์ธ๋ฐ y๋ ์ข์ฐ์ํ ์ด๋ฐ์์ผ๋ก ์ ์ฅํ๋ฉด ์ ๋๋ค๋ ๊ฒ์ด๋ค.)
์ด๊ฑด ์์ผ๋ก ๊ทธ๋ํ ํ์ํ ๋ ํ์๋ก ์์ด์ผ ํ๋ฏ๋ก ๊ธฐ์ตํด๋์.
#์ํ์ข์ฐ๋ฅผ ๋ค ํ์ธํ๊ธฐ ์ํ ๊ฑธ ์ถ๊ฐ (์๋๋ ์ข์ฐ์ํ ์๋๋ก ์ ์ฅ)
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
3. BFS ํน์ DFS ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๋ค.
3.1 BFS
def BFS(x, y):
q = deque() #ํ ์์ฑ
q.append((x, y)) #ํ์ ์ด๊ธฐ ์์น ๋ฃ๊ธฐ
visited[x][y] = 1 #๋ฐฉ๋ฌธ ํ์
ํ์ด์ฌ์์๋ ํจ์๋ฅผ ์ ์ํ๋ ค๋ฉด def๋ฅผ ์ฐ๋ฉด ๋๋ค. BFS ํจ์ ์ธ์์ ์ขํ๊ฐ(0, 0)์ ๋ฃ์ด์ผ ํ๋ฏ๋ก x์ y๋ฅผ ์ด๋ค. ๋ค์์ผ๋ก๋ ํ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฑ์ ์์ฑํ๋ค. ๋ฑ์ ์ด๋ฆ์ q๋ผ๊ณ ์ ์ํ๊ณ , ์ด๊ธฐ ์์น๋ฅผ q์ ๋ฃ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์์ ์์ธํ ์ดํด๋ณผ ๊ฑฐ์ง๋ง, ๊ตฌ์ญ์ ๊ฐ์๋ฅผ ์นด์ดํธํ ๋ ๋ฐฉ๋ฌธ ์ ํ์ ๋ BFS ๋ฌธ์ ๋๋ฆฌ๊ณ ๊ทธ๋๋ง๋ค ์นด์ดํธ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๊ฐ ํ์ํ๋ค.
while q:
x, y = q.popleft() # ๊บผ๋ด๊ธฐ
# ์ขํ ์ด๋ํ๋ฉด์ ์ํ์ข์ฐ ํ์ธ
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
์ด์ ์ขํ๋ฅผ ์ด๋์ํค๋ฉด์ ๊ฐ์ ๊ตฌ์ญ์ ์๋ ๊ฑธ ์ฐพ๋๋ค. popleft()๋ ๋ฑ์ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๊ฑธ ๋นผ๋ด๊ณ ์ญ์ ํ๋ค. ๋ฑ์ ์๋ ํ์ฌ ์ขํ๋ฅผ ๊บผ๋ด์ x, y์ ์ ์ฅํ๋ค. ๋ค์์ผ๋ก๋ ํ์ฌ ์ขํ์์ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ค.
if -1 < nx < N and -1 < ny < N:
if graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
visited[nx][ny] = 1 #๋ฐฉ๋ฌธ์ฒดํฌ ํ ํ์ ๋ฃ์
q.append((nx, ny))
๊ทธ๋ฌ๋ ์ด๋ํ ์ขํ๊ฐ ๊ทธ๋ฆฌ๋ ๋ฐ์ผ๋ก ๋ฒ์ด๋ ์๋ ์๋ค. ์์ ๊ทธ๋ฆผ(2๋ฒ)์์ ํ์ฌ ์ขํ๊ฐ (0, 0) ์ผ ๋ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ฉด Xํ์ ๋ ๊ฒ์ ๋ณผ ์ ์๋๋ฐ ๊ทธ๊ฑด ๋ฏธ๋ก ๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์๋ค๊ณ ํ์ํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊ทธ๋ฆฌ๋ ๋ด์์๋ง ์์ง์ผ ์ ์๋๋ก ์กฐ๊ฑด๋ฌธ์ ๋ฃ์ด์คฌ๋ค.
๋ค์์ผ๋ก๋ ์ํ์ข์ฐ๋ฅผ ํ์ธํ๋ค๊ฐ ์ด๋ํ ์์น๊ฐ ์ด๋ํ๊ธฐ ์ ์์น์ ๊ธ์์ ๊ฐ๋ค๋ฉด ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ๋ค. ๋ง์ฝ ํ์ฌ ์ขํ๊ฐ (0, 0)์ผ ๋ graph[0][0]์ด๊ณ ์ด ๊ฐ์ ํ์ฌ 'R'์ด๋ค. ๊ฑฐ๊ธฐ์ ์ฐ์ธก(graph[0][1])์ผ๋ก ํ ์นธ ์ด๋ํ๋๋ 'R'์ด ์๋ค. ์ด๋ฐ์์ผ๋ก ๊ฐ์ ๊ตฌ์ญ์ธ์ง ์๋์ง๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋๋ ์ขํ๋ฅผ ๋ค์ ํ์ ๋ฃ๋๋ค. ๊ทธ๋ผ ์ด๋๋ ์ขํ๊ฐ ํ์ฌ ์์น๊ฐ ๋๋ค. ์ํ์ข์ฐ๋ฅผ ๋ค ํ์ธํ์ผ๋ฉด ๋ค์ ํ์์ ํ์ฌ ์์น๋ฅผ ๊บผ๋ด์ ํ๊ฐ ๋น ๋๊น์ง ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
3.2 DFS
DFS๋ฅผ ์ ์ํ๊ธฐ ์ ์ ํด์ค์ผ ํ๋ ๊ฒ ์๋ค.
import sys
sys.setrecursionlimit(100000)
ํ์ด์ฌ์ ์ฌ๊ท ์ต๋ ๊น์ด์ ๊ธฐ๋ณธ ์ค์ ์ด 1,000ํ์ด๊ธฐ ๋๋ฌธ์ 'sys.setrecursionlimit(100000)' ์ด ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ์ง ์์ผ๋ฉด ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ DFS๋ฅผ ์ฌ์ฉํ ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ถ๊ฐํด์ฃผ์.
def DFS(x, y):
visited[y][x] == 1
#์ข์ฐ์ํ ํ์ธ
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx <= N and 0 <= ny <= N and visited[ny][nx] == 0 and graph[ny][nx] == graph[y][x]:
DFS(nx, ny)
DFS๋ ๊ฑฐ์ ๋น์ทํ์ง๋ง BFS๋ณด๋ค ํ์ด๊ฐ ๊ฐ๋จํ ๊ฑธ ๋ณผ ์ ์๋ค. ๋จผ์ ํ์ฌ ์ขํ์ ๋ฐฉ๋ฌธํ์๋ฅผ ํด์ค๋ค. ๊ทธ๋ฐ๋ฐ DFS์ ๋ค๋ฅด๊ฒ x์ y์ ์์น๊ฐ ๋ฐ๋์๋ค. ์ด์ ๋ ๋์ด ํ์์ด ์๋๋ผ ๊น์ด ํ์์ด๊ธฐ ๋๋ฌธ์ ์๋์ชฝ์ผ๋ก ํ์ํ๊ธฐ ์ํด์์ด๋ค.
์ข์ฐ์ํ๋ฅผ ํ์ธํ๋ฉด์ ๊ทธ๋ฆฌ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ณ ์ด์ ์์น์ ํ์ฌ ์์น์ ์๊น์ด ๊ฐ์ ๋ ๋ฐฉ๋ฌธํ์ง ์์์ผ๋ฉด ์ฌ๊ท๋ฅผ ๋๋ฆฐ๋ค.
4. Main (์ ๋ ฅ ๋ถ๋ถ)
N = int(input())
graph = []
for _ in range(N):
graph.append(list(map(str, input().rstrip())))
#graph = [list(map(str, input().rstrip())) for _ in range(N)] ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๊ทธ๋ฆฌ๋์ ํฌ๊ธฐ์ ๊ทธ๋ฆฌ๋๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค.
5. ์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ์ ์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ๋ฅผ ๋๋
#์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ
visited = [[0]*N for _ in range(N)] #๋ฐฉ๋ฌธ ํ์
cnt1 = 0
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
cnt1 += 1
BFS(i, j) #DFS(j, i)
#์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ
#visited = [[0 for _ in range(N)] for _ in range(N)] ์ด๋ ๊ฒ๋ ๊ฐ๋ฅ
visited = [[0]*N for _ in range(N)] #์ด๊ธฐํ
cnt2 = 0
for i in range(N):
for j in range(N):
if graph[i][j] == 'G': #G -> R๋ก ๋ณํ
graph[i][j] = 'R'
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
cnt2 += 1
BFS(i, j) #DFS(j, i)
print(cnt1, cnt2)
๋จผ์ ์ด์คfor๋ฌธ์ผ๋ก ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒ(0)์ ์นด์ดํธ ํด์ฃผ๊ณ BFS๋ฅผ ๋๋ฆฐ๋ค. ์ด๋ ๊ฒ ํ๋ฉด BFS๊ฐ ๋์๊ฐ๋ฉด์ ๋ฐฉ๋ฌธ ํ์๋ฅผ ํด์ฃผ๊ณ BFS๊ฐ ๋๋ฌ์ผ๋ฉด ๋ค์ for๋ฌธ์ผ๋ก ๋์์์ ๋ฐฉ๋ฌธํ์ง ์์ ๊ณณ์ ํ์ํ๋ค. ์ด๋ ๊ฒ ํด์ ๊ตฌ์ญ์ ๋๋ ์ฃผ๋ ๊ฒ์ด๋ค.
์ ๋ก์์ฝ์ผ ๊ฒฝ์ฐ์ ๋ฐฉ๋ฌธ ๋ฆฌ์คํธ๋ฅผ ๋ค์ ์ด๊ธฐํํด์ฃผ๊ณ ๋นจ๊ฐ์๊ณผ ์ด๋ก์ ์ค ํ๋๋ฅผ ๊ฐ์ ์์ผ๋ก ๋ฐ๊ฟ์ค๋ค. ํ์๋ ์ด๋ก์์ ๋นจ๊ฐ์์ผ๋ก ๋ฐ๊ฟ์คฌ๋ค. ๊ทธ๋ฆฌ๊ณ ์๊น์ฒ๋ผ ๋ฐ๋ณตํด์ค๋ค. ์ฃผ์ํ ๊ฒ์ DFSํจ์๋ฅผ ํธ์ถํ ๋๋ i์ j์ ์์น๋ฅผ ๋ฐ๊ฟ์ค์ผ ํ๋ค.
๋ง์ง๋ง์ผ๋ก ๊ตฌ์ญ์ ์ถ๋ ฅํ๋ค.
BFS ํ์ด (์ ์ฒด ์ฝ๋)
from collections import deque
import sys
input = sys.stdin.readline #์
์ถ๋ ฅ ํฅ์
N = int(input())
graph = []
for _ in range(N):
graph.append(list(map(str, input().rstrip())))
def BFS(x, y):
# ์ข์ฐ์ํ
dx = [-1, 1, 0, 0]
dy = [0, 0, 1, -1]
q = deque() #ํ ์์ฑ
q.append((x, y)) #ํ์ ์ด๊ธฐ ์์น ๋ฃ๊ธฐ
visited[x][y] = 1
#์ขํ ์ด๋ํ๋ฉด์ ํ์ธ
while q:
x, y = q.popleft() #ํ์์ ๊บผ๋ด์ x, y์ ๋ฃ๊ธฐ
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if -1 < nx < N and -1 < ny < N: #์ด๊ฒ ๋ฌธ์
if graph[nx][ny] == graph[x][y] and visited[nx][ny] == 0:
visited[nx][ny] = 1 # ๋ฐฉ๋ฌธ์ฒดํฌ ํ ํ์ ๋ฃ์
q.append((nx, ny))
#์ ๋ก์์ฝ์ด ์๋ ๊ฒฝ์ฐ
visited = [[0 for _ in range(N)] for _ in range(N)] #๋ฐฉ๋ฌธ ํ์
cnt1 = 0
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
BFS(i, j)
cnt1 += 1
#์ ๋ก์์ฝ์ธ ๊ฒฝ์ฐ
visited = [[0 for _ in range(N)] for _ in range(N)]
cnt2 = 0
for i in range(N):
for j in range(N):
if graph[i][j] == 'G': #G -> R๋ก ๋ณํ
graph[i][j] = 'R'
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
BFS(i, j)
cnt2 += 1
print(cnt1, cnt2)
DFS ํ์ด (์ ์ฒด ์ฝ๋)
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def DFS(x, y):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[y][x] = 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < N and 0 <= ny < N and graph[y][x] == graph[ny][nx] and visited[ny][nx]==0:
DFS(nx, ny)
N = int(input())
graph = []
for _ in range(N):
graph.append(list(map(str, input().rstrip())))
visited = [[0]*N for _ in range(N)] #๋ฐฉ๋ฌธ ํ์
cnt1 = 0
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
cnt1 += 1
DFS(j, i)
#์ ๋ก์์ฝ
visited = [[0]*N for _ in range(N)]
cnt2 = 0
for i in range(N):
for j in range(N):
if graph[i][j] == 'G': #G -> R๋ก ๋ณํ
graph[i][j] = 'R'
for i in range(N):
for j in range(N):
if visited[i][j] == 0:
cnt2 += 1
DFS(j, i)
print(cnt1, cnt2)
'๐งฉ Algorithm > [BOJ] Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| BOJ 1715๋ฒ : ์นด๋ ์ ๋ ฌํ๊ธฐ (Python/Gold 4) (0) | 2023.09.04 |
|---|---|
| BOJ 1339๋ฒ : ๋จ์ด ์ํ (Python/Gold 4) (0) | 2023.07.13 |