백준 10026번 - 적록색약
백준 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와 같이 처리해주고 문제를 풀지, 아니면 탐색 과정에서 두 경우를 고려해줄지 고민하다가 탐색 과정에서 처리하는 방식을 택했다.