[Boj] 적록색약 10026(python)
문제링크 : 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)
댓글남기기