코딩 공부

[Python](BFS) 백준 10026번 : 적록색약 본문

BFS & DFS

[Python](BFS) 백준 10026번 : 적록색약

Algomalgo 2024. 1. 28. 16:33
728x90


<접근 방법>

  1. 적록색약이 아닌 사람과 적록색약인 사람이 인지하는 구역이 다르므로 각각의 상황에 맞는 BFS를 2개 만들어야겠다.
  2. 적록색약이 아닌 사람의 경우, 미방문된 구역을 bfs를 통해 같은 색깔끼리 하나의 덩어리로 계산하도록 하고,
    적록색약인 사람의 경우, 미방문된 구역을 bfs를 통해 R이나 G일 경우 서로가 같은 색으로 인식될 수 있게 계산한다.
from collections import deque

def bfs(si, sj):    # 적록색약이 아닌 사람의 경우
    visited[si][sj] = 1
    q = deque()
    q.append((si, sj))
    while q:
        ci, cj = q.popleft()
        for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
            ni = ci + di
            nj = cj + dj
            if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and board[ni][nj] == board[si][sj]:
                q.append((ni, nj))
                visited[ni][nj] = 1


def bbfs(si, sj):   # 적록색약인 사람의 경우
    visited[si][sj] = 1
    q = deque()
    q.append((si, sj))
    
    # R이나 G가 덩어리의 기준일 경우
    if board[si][sj] == 'R' or board[si][sj] == 'G':
        while q:
            ci, cj = q.popleft()
            for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
                ni = ci + di
                nj = cj + dj
                if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and (board[ni][nj] == 'R' or board[ni][nj] == 'G'):
                    q.append((ni, nj))
                    visited[ni][nj] = 1
    else:   # B가 덩어리의 기준일 경우
        while q:
            ci, cj = q.popleft()
            for di, dj in ((-1, 0), (0, 1), (1, 0), (0, -1)):
                ni = ci + di
                nj = cj + dj
                if 0<=ni<N and 0<=nj<N and not visited[ni][nj] and board[ni][nj] == 'B':
                    q.append((ni, nj))
                    visited[ni][nj] = 1


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

# 적록색약이 아닌 사람의 경우
count_1 = 0
visited = [[0]*N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            count_1 += 1
            bfs(i, j)

# 적록색약인 사람의 경우
count_2 = 0
visited = [[0]*N for _ in range(N)]
for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            count_2 += 1
            bbfs(i, j)
            
print(count_1, count_2)

이해가 되지 않는 부분이 있으면 질문 주세요. 감사합니다.

728x90