BOJ/Python

백준 10026번 적록색약 파이썬 DFS

띵지니어 2022. 2. 10. 07:55

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

 

10026번: 적록색약

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

www.acmicpc.net

 

답안

import sys
sys.setrecursionlimit(10**4)

def dfs_R(x,y):
    if x < 0 or y < 0 or x >= n or y >= n:
        return False
    if graph[x][y] == 'R':
        graph[x][y] = 'C'
        dfs_R(x-1,y)
        dfs_R(x,y-1)
        dfs_R(x+1,y)
        dfs_R(x,y+1)
        return True
    return False

def dfs_G(x,y):
    if x < 0 or y < 0 or x >= n or y >= n:
        return False
    if graph[x][y] == 'G':
        graph[x][y] = 'C'
        dfs_G(x-1,y)
        dfs_G(x,y-1)
        dfs_G(x+1,y)
        dfs_G(x,y+1)
        return True
    return False

def dfs_B(x,y):
    if x < 0 or y < 0 or x >= n or y >= n:
        return False
    if graph[x][y] == 'B':
        graph[x][y] = 'C'
        dfs_B(x-1,y)
        dfs_B(x,y-1)
        dfs_B(x+1,y)
        dfs_B(x,y+1)
        return True
    return False

def dfs_R_G(x,y):
    if x < 0 or y < 0 or x >= n or y >= n:
        return False
    if graph2[x][y] == 'R' or graph2[x][y] == 'G':
        graph2[x][y] = 'C'
        dfs_R_G(x-1,y)
        dfs_R_G(x,y-1)
        dfs_R_G(x+1,y)
        dfs_R_G(x,y+1)
        return True
    return False

def dfs_B2(x,y):
    if x < 0 or y < 0 or x >= n or y >= n:
        return False
    if graph2[x][y] == 'B':
        graph2[x][y] = 'C'
        dfs_B2(x-1,y)
        dfs_B2(x,y-1)
        dfs_B2(x+1,y)
        dfs_B2(x,y+1)
        return True
    return False

result = 0
n = int(input())
graph = []
graph2 = []

for _ in range(n):
    k = input()
    graph.append(list(k))
    graph2.append(list(k))
    
#RGB
    
for i in range(n):
    for j in range(n):
        if dfs_R(i,j):
            result += 1
            
for i in range(n):
    for j in range(n):
        if dfs_G(i,j):
            result += 1

for i in range(n):
    for j in range(n):
        if dfs_B(i,j):
            result += 1
            
print(result, end = ' ')
result = 0

#RRB

for i in range(n):
    for j in range(n):
        if dfs_R_G(i,j):
            result += 1

for i in range(n):
    for j in range(n):
        if dfs_B2(i,j):
            result += 1
          
print(result)

 


 

좀 길어 보이지만 반복된 게 많이 쓰였기 때문에 간단한 코드이다.

그래프를 2개 만들어서 앞 케이스, 뒤 케이스 따로따로 탐색을 진행하였다.

탐색하는 각 단어별로 DFS를 해주었고, 탐색이 끝난 위치는 'C'로 변경해 주었다.

좀 무지성으로 한 것 같긴 한데.. 시간이 없어서 아는 대로만 쉽게 짰다!