백준 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

  1. graph을 이용한 문제. 백준 4963번에서는 0,1 두 개만 고려해서 구역을 나누면 되었다면, 10026번에서는 RGB 3종류를 고려해서 구역을 나누어야해서 고려할 부분이 많았다.
  2. 적록색맹의 경우 구역의 갯수를 구하는 과정에서 미리 RG를 K와 같이 처리해주고 문제를 풀지, 아니면 탐색 과정에서 두 경우를 고려해줄지 고민하다가 탐색 과정에서 처리하는 방식을 택했다.