백준 10026번 바로가기
나의 풀이#
# 입력
import sys
from collections import deque
sys.setrecursionlimit(10**6)
n = int(sys.stdin.readline().strip())
maps = [[] * n for _ in range(n)]
for i in range(n):
maps[i] = list(sys.stdin.readline().strip())
count = 0
visited = [[False] * n for _ in range(n)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 처리
def bfs(i, j, color):
queue = deque()
queue.append([i, j])
visited[i][j] = True
while queue:
i, j = queue.popleft()
for k in range(4):
x = i + dx[k]
y = j + dy[k]
if not 0 <= x < n or not 0 <= y < n or visited[x][y]:
continue
if color == maps[x][y]:
visited[x][y] = True
queue.append([x, y])
return
for i in range(n):
for j in range(n):
if visited[i][j] == False:
bfs(i, j, maps[i][j])
count += 1
print(count, end=" ")
def bfs_blind(i, j, color):
queue = deque()
queue.append([i, j])
visited[i][j] = True
while queue:
i, j = queue.popleft()
for k in range(4):
x = i + dx[k]
y = j + dy[k]
if not 0 <= x < n or not 0 <= y < n or visited[x][y]:
continue
if color == "B" and maps[x][y] == "B":
visited[x][y] = True
queue.append([x, y])
elif color != "B" and maps[x][y] != "B":
visited[x][y] = True
queue.append([x, y])
return
count = 0
visited = [[False] * n for _ in range(n)]
for i in range(n):
for j in range(n):
if visited[i][j] == False:
bfs_blind(i, j, maps[i][j])
count += 1
print(count)
CODE REVIEW#
- graph을 이용한 문제. 백준 4963번에서는 0,1 두 개만 고려해서 구역을 나누면 되었다면, 10026번에서는 RGB 3종류를 고려해서 구역을 나누어야해서 고려할 부분이 많았다.
- 적록색맹의 경우 구역의 갯수를 구하는 과정에서 미리 RG를 K와 같이 처리해주고 문제를 풀지, 아니면 탐색 과정에서 두 경우를 고려해줄지 고민하다가 탐색 과정에서 처리하는 방식을 택했다.