1 분 소요

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

오늘부터 DFS, BFS 문제 시작

입력의 첫 줄에는 행의 개수 N이 주어지며. 그 다음 줄부터 각 행에 관한 정보가 입력됨

matrix의 원소로는 G, R, B로 이루어져 있으나, 적록색약의 경우 R, B로 이루어져 있어야 함

이에 따라, matrix를 deepcopy하기 위해 copy모듈에 deepcopy를 사용함

blind_matrix = matrix를 할 경우, 리스트는 참조형이므로 matrix를 변경할 경우 blind_matrix도 변경되기 때문

필자는 보통 DFS를 사용할 때 이런 형태로 많이 사용하며, index 범위를 벗어났을 때에는 그대로 return을 하고

color를 검사한 곳은 리스트 이외의 원소인 1로 바꾸고, 좌표를 변경하여 DFS를 실행함.

또한, 하나의 함수에서 다 처리하고 싶었기 때문에, flag로 적록색약과 정상인을 구별함.

이때, 주의할 점은 sys.setrecursionlimit(10**8) 안할시 오류가 생길 수 있음

결국, DFS나 BFS로 풀 수 있는 문제이며, 필자는 DFS를 선택

import sys
sys.setrecursionlimit(10**8)
import copy

def DFS(x, y, color, flag):
    if x < 0 or x >= N or y < 0 or y >= N:
        return
    if 0 <= x < N and 0 <= y < N and not flag and matrix[x][y] == color:
        matrix[x][y] = 1
        DFS(x+1, y, color, flag)
        DFS(x-1, y, color, flag)
        DFS(x, y+1, color, flag)
        DFS(x, y-1, color, flag)
    if 0 <= x < N and 0 <= y < N and flag and blind_matrix[x][y] == color:
        blind_matrix[x][y] = 1
        DFS(x + 1, y, color, flag)
        DFS(x - 1, y, color, flag)
        DFS(x, y + 1, color, flag)
        DFS(x, y - 1, color, flag)
    return



N = int(input())
matrix = []
for _ in range(N):
    tmp = list(input())
    matrix.append(tmp)

blind_matrix = copy.deepcopy(matrix)
for row in range(N):
    for col in range(N):
        if blind_matrix[row][col] == 'G':
            blind_matrix[row][col] = 'R'

answer = 0
for row in range(N):
    for col in range(N):
        if matrix[row][col] in ['G', 'R', 'B']:
            DFS(row, col, matrix[row][col], 0)
            answer += 1

blind_answer = 0
for row in range(N):
    for col in range(N):
        if blind_matrix[row][col] in ['G', 'R', 'B']:
            DFS(row, col, blind_matrix[row][col], 1)
            blind_answer += 1


print(answer, blind_answer)


카테고리:

업데이트:

댓글남기기