BOJ

[BOJ] 10026. 적록색약

rubato.dev 2025. 7. 23. 11:03

📌 문제 제목

문제 링크: BOJ 10026

🗒️ 문제 설명

R, G, B로만 칠해진 N x M 크기의 그림이 있다.

적록색약인 사람이 봤을 때 그림의 구역의 수와 적록색약이 아닌 사람이 봤을 때 구역의 수를 구하여라.

시간 제한: 1초

메모리 제한: 128MB

1 <= N <= 100


💡 문제 해결 아이디어

  • 그래프를 적록색약인 사람과 적록색약이 아닌 사람 두 개로 만들어서 풀면 된다.
  • 인풋이 R, G, B가 모두 있는 그림이므로 이중 for문을 돌면서 R와 G을 T로 둔 적록색약형 그림을 그린다.
  • 적록색약형 그림과 적록색약이 아닌 형 그림을 BFS로 돌면서 구역의 개수를 구한다.
  • BFS에 color를 매개변수로 넘겨서 상하좌우에 color가 같고 아직 방문하지 않았으면 큐에 추가

⌛️ 시간 복잡도

  • O(N^2)

✅ 최종 코드

import sys
from collections import deque
input = sys.stdin.readline

N = int(input().strip())
graph = [input().strip() for _ in range(N)]
b_graph = [['B'] * N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if graph[i][j] == 'R' or graph[i][j] == 'G':
            b_graph[i][j] = 'T'

direction = [(-1, 0), (1, 0), (0, -1), (0, 1)]


def bfs(graph, x, y, visited, color):
    queue = deque([(x, y)])
    visited[x][y] = True
    while queue:
        xp, yp = queue.popleft()
        for dx, dy in direction:
            nx, ny = xp + dx, yp + dy
            if not (0 <= nx < N and 0 <= ny < N):
                continue
            if graph[nx][ny] == color and not visited[nx][ny]:
                queue.append((nx, ny))
                visited[nx][ny] = True


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

answer = 0
b_answer = 0

for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            bfs(graph, i, j, visited, graph[i][j])
            answer += 1

for i in range(N):
    for j in range(N):
        if not b_visited[i][j]:
            bfs(b_graph, i, j, b_visited, b_graph[i][j])
            b_answer += 1

print(answer, b_answer)