R, G, B로 이뤄진 n X n 그래프가 주어질 때,
R, G, B 3가지로 구분된 영역의 개수와,
R/G, B 2가지로 구분된 영역의 개수를 구하는 문제이다.
그래프 탐색이라 DFS로 풀었다.
지금까지 풀었던 DFS와 다른 점이라 하면..
0과 1 같은 2개의 값으로 구성된 그래프가 아니라,
R, G, B라는 3개의 문자로 구성된 그래프라는 것이다.
적록 색약인 경우는 이전에 풀었던 DFS와 같지만,
적록 색약이 아닌 경우를 위해 visited라는 리스트를 뒀다.
그리고 아래의 2가지 조건을 만족하는 경우에만 재귀 탐색을 하도록 했다.
1) 탐색하려는 좌표가 아직 방문되지 않았다. (visited 값이 False)
2) 탐색하려는 좌표가 현재 좌표와 색이 같다.
# 10026
import sys
sys.setrecursionlimit(10000)
def dfs(x, y):
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
visited[x][y] = True
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if (0 <= nx < n) and (0 <= ny < n):
if not visited[nx][ny]:
if graph[ny][nx] == graph[y][x]:
dfs(nx, ny)
n = int(sys.stdin.readline())
graph = []
for _ in range(n):
graph.append(list(sys.stdin.readline().rstrip()))
# 1. 적록 색약이 아닌 사람
visited = [[False for _ in range(n)] for _ in range(n)]
cnt = 0
for i in range(n):
for j in range(n):
if not visited[i][j]:
dfs(i, j)
cnt += 1
print(cnt)
# 2. 적록 색약인 사람
for i in range(n):
for j in range(n):
if graph[j][i] == 'R':
graph[j][i] = 'G'
visited = [[False for _ in range(n)] for _ in range(n)]
cnt = 0
for i in range(n):
for j in range(n):
if not visited[i][j]:
dfs(i, j)
cnt += 1
print(cnt)