[백준/Python] 10026 적록색약

2.so_j·2023년 7월 24일

문제는 여기

코드

from collections import deque
import sys
n = int(sys.stdin.readline())

graph = [list(sys.stdin.readline().rstrip()) for _ in range(n)]

dx = [0,0,-1,1]
dy = [1,-1,0,0]

def bfs(i,j,isBlindness,prev):
    queue = deque()
    queue.append((i,j))
    visited[i][j] = True

    while queue:
        x, y = queue.popleft()

        for i in range(4):
            nx = dx[i] + x
            ny = dy[i] + y

            if 0 <= nx < n and 0 <= ny < n:
                if isBlindness: # 적록색약이면
                    if not visited[nx][ny]:
                        if graph[nx][ny] == prev or (prev == 'G' and graph[nx][ny] == 'R') or (prev == 'R' and graph[nx][ny] == 'G'):
                            visited[nx][ny] = True
                            queue.append((nx, ny))
                else: # 적록색약이 아니면
                    if not visited[nx][ny] and graph[nx][ny] == prev:
                        visited[nx][ny] = True
                        queue.append((nx,ny))

visited = [[False] * n for _ in range(n)]
result = [0,0]

# 적록색약 아님
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            prev = graph[i][j]
            bfs(i, j, False, prev)
            result[0] += 1

# 적록색약
visited = [[False] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            prev = graph[i][j]
            bfs(i, j, True, prev)
            result[1] += 1

print(result[0], end=' ')
print(result[1])

기록할 점

  1. 적록색약 아닌 경우
    전에 탐색했던 값과 다음으로 탐색할 값이 같으면 deque에 넣고 계속 방문

  2. 적록색약인 경우
    R과 G가 같은 경우로 보고 탐색이 되어야한다

    전에 탐색했던 값(prev)과 다음으로 탐색할 값(next)이 같거나
    prev가 G인데 next가 R인 경우
    prev가 R인데 next가 G인 경우
    같은 것으로 처리하여 계속 방문할 수 있도록 해주었습니다

profile
싱글코어 두뇌의 개발자 도전기

0개의 댓글