요구사항
- 시간제한 1초
- 메모리 제한 128MB
- 적록색약이 아닌 사람과 그런 사람이 볼 수 있는 구역의 수를 구하라.
설계
- 적록색약이냐 아니냐를 플래그로 만들어서 bfs 함수에 넣어준다.
- 추가로 방문 여부와 count 값도 따로 만들어준다.
구현
from collections import deque
# 방향 벡터 (상, 하, 좌, 우)
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y, grid, visited, n, color_blind):
queue = deque([(x, y)])
visited[x][y] = True
current_color = grid[x][y]
while queue:
cx, cy = queue.popleft()
for i in range(4):
nx, ny = cx + dx[i], cy + dy[i]
if 0 <= nx < n and 0 <= ny < n and not visited[nx][ny]:
if color_blind:
# 적록색약인 경우
if current_color in "RG" and grid[nx][ny] in "RG":
visited[nx][ny] = True
queue.append((nx, ny))
elif grid[nx][ny] == current_color:
visited[nx][ny] = True
queue.append((nx, ny))
else:
# 일반인
if grid[nx][ny] == current_color:
visited[nx][ny] = True
queue.append((nx, ny))
# 입력
n = int(input())
grid = [input().strip() for _ in range(n)]
# 일반인 경우
visited_normal = [[False] * n for _ in range(n)]
normal_count = 0
# 적록색약 경우
visited_blind = [[False] * n for _ in range(n)]
blind_count = 0
# 탐색
for i in range(n):
for j in range(n):
if not visited_normal[i][j]:
bfs(i, j, grid, visited_normal, n, False)
normal_count += 1
if not visited_blind[i][j]:
bfs(i, j, grid, visited_blind, n, True)
blind_count += 1
# 결과 출력
print(normal_count, blind_count)