아이디어

  1. DFS를 미로찾기 형식으로 활용해서 구역 나누면 되겠다.
  2. 적록색약이 볼 때는 R과 B가 같으니 B를 R로 바꾸고 1의 작업을 다시 하면되겠다.

 


풀이 및 코드(해설)

import sys
sys.setrecursionlimit(10 ** 6)     # 핵심!!!!!!!!!!!

di = [0, 1, 0, -1]
dj = [1, 0, -1, 0]

def dfs(color, N, r, c):
    visited[r][c] = 1
    for dr, dc in [[0, 1], [1, 0], [0, -1], [-1, 0]]:
        nr, nc = r + dr, c + dc
        if 0 <= nr < N and 0 <= nc < N:
            if arr[nr][nc] == color and visited[nr][nc] == 0:
                dfs(color, N, nr, nc)


N = int(sys.stdin.readline())
arr = [list(map(str, sys.stdin.readline().rstrip())) for _ in range(N)]

visited = [[0]*N for _ in range(N)]

color = ['R', 'G', 'B']

result_1 = 0

for c in color:
    for i in range(N):
        for j in range(N):
            if arr[i][j] == c and not visited[i][j]:
                dfs(c, N, i, j)
                result_1 += 1

color = ['R', 'B']
visited = [[0]*N for _ in range(N)]
result_2 = 0
for i in range(N):
    for j in range(N):
        if arr[i][j] == 'G':
            arr[i][j] = 'R'

for c in color:
    for i in range(N):
        for j in range(N):
            if arr[i][j] == c and not visited[i][j]:
                dfs(c, N, i, j)
                result_2 += 1

print(result_1, result_2)

 


후기

  1. 골드문제라 긴장했는데 쉽다..
  2. 나는 문제를 알려주신분이 sys.setrecursionlimit()을 팁으로 남겨놔서 일단 재귀의 깊이 제한을 늘려놨다..
  3. sys.setrecursionlimit()를 사용해보라고 만든 문제같다.
복사했습니다!