백준 10026 적록색약

김민영·2023년 1월 9일
0

알고리즘

목록 보기
42/125

과정

  • R, G, B를 구분해서 영역 개수 구하기 & RG, B를 구분해서 영역 개수 구하기
  • BFS로 풀 것이다.
  • 정상인이 보는 답을 계산한 후, 2차원 리스트에서 G를 모두 R로 바꾼 후 적록색맹이 보는 답을 계산한다.
  • 정상인 계산 후, 적록색맹 계산하기 전, visited 리스트 초기화하기.
from collections import deque
import sys

N = int(input())
map_lst = [list(input()) for _ in range(N)]

# 상 우 하 좌
dx = [0, 1, 0, -1]
dy = [1, 0, -1, 0]

def bfs_normal(x, y, target):
    if visited[y][x]:
        return False
    queue = deque([[x, y]])
    visited[y][x] = True
    while queue:
        a = queue.popleft()
        x = a[0]
        y = a[1]
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < N and 0 <= ny < N and not visited[ny][nx] and map_lst[ny][nx] == target:
                visited[ny][nx] = True
                queue.append([nx, ny])
    return True

# 정상인
visited = []
for i in range(N):
    visited.append([False] * N)

ans_normal = 0
for i in range(N):
    for j in range(N):
        if bfs_normal(i, j, map_lst[j][i]):
            ans_normal += 1

# 적록색맹
visited = []
for i in range(N):
    visited.append([False] * N)
    
for i in range(N):
    for j in range(N):
        if map_lst[j][i] == "G":
            map_lst[j][i] = "R"
ans_weak = 0
for i in range(N):
    for j in range(N):
        if bfs_normal(i, j, map_lst[j][i]):
            ans_weak += 1

print(ans_normal, ans_weak)
profile
노션에 1차 정리합니당 - https://cream-efraasia-f3c.notion.site/4fb02c0dc82e48358e67c61b7ce8ab36?v=

0개의 댓글