[백준] 10026번 파이썬

Heejun Kim·2022년 6월 2일
0

Coding Test

목록 보기
28/51

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

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

# 변수 선언
N = int(input())
RGB = [list(map(str, input().strip())) for _ in range(N)]
visit = [[False for _ in range(N)] for _ in range(N)]
answer = [0, 0]
queue = deque()


# bfs 선언
def bfs(x, y):
    queue.append([x, y])
    visit[x][y] = True
    color = RGB[x][y]

    while queue:
        x, y = queue.popleft()
        dx = [1, -1, 0, 0]
        dy = [0, 0, 1, -1]

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < N:
                # 색깔이 같고, 방문하지 않았다면 다음 탐색 대상
                if color == RGB[nx][ny] and not visit[nx][ny]:
                    queue.append([nx, ny])
                    visit[nx][ny] = True
    return None


# 탐색 시작: 일반인일때
for x in range(N):
    for y in range(N):
        if not visit[x][y]:
            bfs(x, y)
            answer[0] += 1

# 적녹색약은 빨강과 그린을 구별할 수 없다. 따라서 R 또는 G를 둘 중 하나로 통일한다.
for x in range(N):
    for y in range(N):
        if RGB[x][y] == 'G':
            RGB[x][y] = 'R'

# 재탐색해야 되니 방문 기록을 초기화해주자
visit = [[False for _ in range(N)] for _ in range(N)]

# 탐색 시작: 적녹색약일때
for x in range(N):
    for y in range(N):
        if not visit[x][y]:
            bfs(x, y)
            answer[1] += 1

# 정답 출력
for i in range(2):
    print(answer[i], end=" ")

0개의 댓글