[백준 10026] 적록색약

코뉴·2021년 8월 11일
0

백준🍳

목록 보기
49/149
post-custom-banner

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

🥚문제


🥚입력/출력


🍳코드

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

n = int(input())

# arr 생성
arr = []
for _ in range(n):
    arr.append(list(input().strip()))

# 방문 여부를 기록하는 visited 배열
visited = [[False]*n for _ in range(n)]

# BFS 함수. 인자로 받은 color를 탐색한다
# color: RG일 때는, R과 G를 탐색한다
def bfs(row, col, color):

    queue = deque([(row, col)])
    visited[row][col] = color

    while queue:
        r, c = queue.popleft()
        dirs = [(0, 1), (0, -1), (1, 0), (-1, 0)]
        for dir in dirs:
            new_r = r + dir[0]
            new_c = c + dir[1]
            # 유효 범위 내에 있을 때
            if 0 <= new_r < n and 0 <= new_c < n:
                # 만약 탐색하고 있는 color가 "RG"라면
                if color == "RG":
                    # 색이 R이거나 G이고,
                    if arr[new_r][new_c] == "R" or arr[new_r][new_c] == "G":
                        # 아직 방문하지 않았다면
                        if not visited[new_r][new_c]:
                            # visited에 기록하고
                            visited[new_r][new_c] = True
                            # queue에 추가
                            queue.append((new_r, new_c))
                # 탐색하고 있는 color가 "RG"가 아니면
                else:
                    # 탐색하고 있는 color와 같은 색이고, 아직 방문하지 않았다면
                    if arr[new_r][new_c] == color and not visited[new_r][new_c]:
                        # visited에 기록하고
                        visited[new_r][new_c] = True
                        # queue에 추가
                        queue.append((new_r, new_c))


# 적록색약이 아닌 사람이 보는 구역의 수
count = 0
# 적록색약인 사람이 보는 구역의 수
rg_count = 0

# 적록색약이 아닌 사람
for row in range(n):
    for col in range(n):
        if not visited[row][col]:
            # R
            if arr[row][col] == "R":
                bfs(row, col, "R")
                count += 1
            # G
            elif arr[row][col] == "G":
                bfs(row, col, "G")
                count += 1
            # B
            elif arr[row][col] == "B":
                bfs(row, col, "B")
                count += 1

# 적록색약인 사람
# visited 초기화
visited = [[False]*n for _ in range(n)]
for row in range(n):
    for col in range(n):
        if not visited[row][col]:
            # RG
            if arr[row][col] == "R" or arr[row][col] == "G":
                bfs(row, col, "RG")
                rg_count += 1
            # B
            elif arr[row][col] == "B":
                bfs(row, col, "B")
                rg_count += 1

print(count, rg_count)

🧂아이디어

  • 케이스를 나누어 BFS/DFS를 하는 간단한 문제
profile
코뉴의 도딩기록
post-custom-banner

0개의 댓글