10026: 적록색약

ewillwin·2023년 7월 5일
0

Problem Solving (BOJ)

목록 보기
105/230

  • dfs를 이용한 풀이
  • dfs()는 정상인 경우에 하나의 구역(빨간색 or 초록색 or 파란색)에 대해 0으로 값을 변경해주는 함수
  • dfs_B()는 적록색약인 경우에 파란색 구역에 대해 0으로 값을 변경해주는 함수
  • dfs_RG()는 적록색약인 경우에 빨간색 또는 초록색 구역에 대해 0으로 값을 변경해주는 함수
import sys
from collections import deque
import copy
sys.setrecursionlimit(10**6)

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

def dfs(x, y, color):
    if x < 0 or y < 0 or x >= N or y >= N:
        return

    if grid[x][y] == color:
        grid[x][y] = 0
        for i in range(4):
            dfs(x + dx[i], y + dy[i], color)

def dfs_B(x, y, color):
    if x < 0 or y < 0 or x >= N or y >= N:
        return

    if origin_grid[x][y] == color:
        origin_grid[x][y] = 0
        for i in range(4):
            dfs_B(x + dx[i], y + dy[i], color)
                
def dfs_RG(x, y, color):
    if x < 0 or y < 0 or x >= N or y >= N:
        return
    
    if origin_grid[x][y] == 'R' or origin_grid[x][y] == 'G':
        origin_grid[x][y] = 0
        for i in range(4):
            dfs_RG(x + dx[i], y + dy[i], color)
                

N = int(input())
origin_grid = []
for n in range(N):
    origin_grid.append(list(sys.stdin.readline()[:-1]))

grid = copy.deepcopy(origin_grid)
normal_count = 0
for i in range(N):
    for j in range(N):
        if grid[i][j] != 0:
            dfs(i, j, grid[i][j])
            normal_count += 1

abnormal_count = 0
for i in range(N):
    for j in range(N):
        if origin_grid[i][j] == 'B':
            dfs_B(i, j, origin_grid[i][j])
            abnormal_count += 1
        elif origin_grid[i][j] == 'R' or origin_grid[i][j] == 'G':
            dfs_RG(i, j, origin_grid[i][j])
            abnormal_count += 1

print(normal_count, abnormal_count)
profile
Software Engineer @ LG Electronics

0개의 댓글