아이디어
- DFS를 미로찾기 형식으로 활용해서 구역 나누면 되겠다.
- 적록색약이 볼 때는 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)
후기
- 골드문제라 긴장했는데 쉽다..
- 나는 문제를 알려주신분이 sys.setrecursionlimit()을 팁으로 남겨놔서 일단 재귀의 깊이 제한을 늘려놨다..
- sys.setrecursionlimit()를 사용해보라고 만든 문제같다.
'백준' 카테고리의 다른 글
백준 7576 토마토 BFS (파이썬) (0) | 2022.09.10 |
---|---|
백준 1012 유기농 배추 DFS (파이썬) (0) | 2022.09.05 |
백준 2667 단지번호붙이기 (파이썬) (0) | 2022.09.03 |
백준 2606 바이러스 (파이썬) (0) | 2022.09.03 |
백준 1181 단어 정렬 sorted, lambda (파이썬) (0) | 2022.08.29 |