본문 바로가기
알고리즘 풀이/DFS & BFS

[백준/Python] 10026번: 적록색약

by developer jini 2023. 1. 4.
728x90

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록)

www.acmicpc.net

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

n = int(input())

# 2차원 리스트의 맵 정보 입력받기
graph = []
for i in range(n):
    graph.append(list(sys.stdin.readline()))
# copy 라이브러리를 통해 리스트 복사
graph2 = copy.deepcopy(graph)
result = 0
result2 = 0


#dfs red
def dfs_r(x, y):  # dfs 함수 정의
    # 주어진 범위를 벗어나는 경우에는 즉시종료
    if x <= -1 or x >= n or y <= -1 or y >= n:
        return False
    # 현재 노드를 아직 방문하지 않았다면
    if graph[x][y] == "R":
        # 해당 노드를 방문 처리
        graph[x][y] = "O"
        # 상,하,좌,우의 위치도 모두 재귀적으로 호출
        dfs_r(x - 1, y)  # 상
        dfs_r(x, y - 1)  # 좌
        dfs_r(x + 1, y)  # 하
        dfs_r(x, y + 1)  # 우
        return True
    return False


# dfs green
def dfs_g(x, y):  # dfs 함수 정의
    # 주어진 범위를 벗어나는 경우에는 즉시종료
    if x <= -1 or x >= n or y <= -1 or y >= n:
        return False
    # 현재 노드를 아직 방문하지 않았다면
    if graph[x][y] == "G":
        # 해당 노드를 방문 처리
        graph[x][y] = "O"
        # 상,하,좌,우의 위치도 모두 재귀적으로 호출
        dfs_g(x - 1, y)  # 상
        dfs_g(x, y - 1)  # 좌
        dfs_g(x + 1, y)  # 하
        dfs_g(x, y + 1)  # 우
        return True
    return False


# dfs blue
def dfs_b(x, y):  # dfs 함수 정의
    # 주어진 범위를 벗어나는 경우에는 즉시종료
    if x <= -1 or x >= n or y <= -1 or y >= n:
        return False
    # 현재 노드를 아직 방문하지 않았다면
    if graph[x][y] == "B":
        # 해당 노드를 방문 처리
        graph[x][y] = "O"
        # 상,하,좌,우의 위치도 모두 재귀적으로 호출
        dfs_b(x - 1, y)  # 상
        dfs_b(x, y - 1)  # 좌
        dfs_b(x + 1, y)  # 하
        dfs_b(x, y + 1)  # 우
        return True
    return False

# 적록색맹인 경우 Blue dfs
def dfs_b2(x, y):  # dfs 함수 정의
    # 주어진 범위를 벗어나는 경우에는 즉시종료
    if x <= -1 or x >= n or y <= -1 or y >= n:
        return False
    # 현재 노드를 아직 방문하지 않았다면
    if graph2[x][y] == "B":
        # 해당 노드를 방문 처리
        graph2[x][y] = "O"
        # 상,하,좌,우의 위치도 모두 재귀적으로 호출
        dfs_b2(x - 1, y)  # 상
        dfs_b2(x, y - 1)  # 좌
        dfs_b2(x + 1, y)  # 하
        dfs_b2(x, y + 1)  # 우
        return True
    return False

# 적록색맹일때 dfs
def dfs_rg(x, y):  # dfs 함수 정의
    # 주어진 범위를 벗어나는 경우에는 즉시종료
    if x <= -1 or x >= n or y <= -1 or y >= n:
        return False
    # 현재 노드를 아직 방문하지 않았다면
    if graph2[x][y] == "R" or graph2[x][y] == "G":
        # 해당 노드를 방문 처리
        graph2[x][y] = "O"
        # 상,하,좌,우의 위치도 모두 재귀적으로 호출
        dfs_rg(x - 1, y)  # 상
        dfs_rg(x, y - 1)  # 좌
        dfs_rg(x + 1, y)  # 하
        dfs_rg(x, y + 1)  # 우
        return True
    return False


for i in range(n):
    for j in range(n):
        # 현재 위치에서 DFS
        if dfs_b2(i, j):
            result2 += 1
        if dfs_rg(i, j):
            result2 += 1
        if dfs_r(i, j):
            result += 1
        if dfs_b(i, j):
            result += 1
        if dfs_g(i, j):
            result += 1


print(result, result2)

 

리스트를 복사하는 과정에서 시간이 많이 걸렸다. 

https://black-hair.tistory.com/49 해당 블로그를 통해 리스트 복사를 참고하였음.

728x90

댓글