[BOJ] 10026번 적록색약 python

chowisely·2020년 8월 22일
0

BOJ

목록 보기
8/70

https://www.acmicpc.net/problem/10026

문제
적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다) 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

input
5
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

output
4 3

import sys

def bfs(color, i, j):
    q = [(i, j)]

    while len(q) != 0:
        pos = q.pop(0)
        x = pos[0]
        y = pos[1]

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if -1 < nx < n and -1 < ny < n and arr[nx][ny] in color and not visited[nx][ny]:
                visited[nx][ny] = True
                q.append((nx, ny))


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

n = int(input())
arr = [list(map(lambda x : list(x), sys.stdin.readline().split()))[0] for _ in range(n)]

visited = [[False] * n for _ in range(n)]
nblind = 0
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            visited[i][j] = True
            bfs(list(arr[i][j]), i, j)
            nblind += 1

visited = [[False] * n for _ in range(n)]
blind = 0
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            visited[i][j] = True
            if arr[i][j] == 'R' or arr[i][j] == 'G':
                bfs(['R', 'G'], i, j)
            else:
                bfs(['B'], i, j)
            blind += 1

print(nblind, blind)

0개의 댓글