10026 : 적록색약

서희찬·2021년 10월 7일
0

백준

목록 보기
60/105

문제

코드

import sys
sys.setrecursionlimit(10**4)
input=sys.stdin.readline

n = int(input())
dx = [1,-1,0,0]
dy = [0,0,-1,1]
cnt1=0;cnt3=0;cnt4=0
flag =0



def dfsR(x,y): 
    flag = graph[x][y]
     
    for i in range(4):
        cx = x+dx[i]
        cy = y+dy[i]
        if(flag=='R'):
            graph[x][y]='Rr' #방문 !
            if 0<=cx<n  and 0<=cy<n and graph[cx][cy]=='R': #방문안한 곳 
                dfsR(cx,cy)
        elif(flag=='B'):
            graph[x][y]='B.' #방문 !         
            if 0<=cx<n  and 0<=cy<n and graph[cx][cy]=='B': #방문안한 곳 
                dfsR(cx,cy)
        elif(flag=='G'):
            graph[x][y]='Rr' #방문 ! 
            if 0<=cx<n  and 0<=cy<n and graph[cx][cy]=='G': #방문안한 곳 
                dfsR(cx,cy)

def dfsRr(x,y):
    graph[x][y]=1 #방문 ! 
    for i in range(4):
        cx = x+dx[i]
        cy = y+dy[i]
        if 0<=cx<n  and 0<=cy<n and graph[cx][cy]=='Rr': #방문안한 곳 
            dfsRr(cx,cy)


graph = [0 for _ in range(n)]

for i in range(n):
    line = input()
    graph[i] =list(line) #문자열 넣기 

for j in range(n):
    for k in range(n):
        if (graph[j][k]=='R' or graph[j][k]=='G'):
            dfsR(j,k)
            cnt1+=1
        elif (graph[j][k]=='B'):
            dfsR(j,k)
            cnt3+=1

for j in range(n):
    for k in range(n):
        if (graph[j][k]=='Rr'):
            dfsRr(j,k)
            cnt4+=1
 
print(cnt1+cnt3, cnt3+cnt4)

풀이

앞선 문제들과 전체적인 틀은 같지만 다른 문제이다.
그 이유는 행렬내에서 RGB모두를 구분해줘야한다는 점이다.. 그리고 적록색약인 친구를위해 RG, B를 구분해줘야하는 것이다.
그래서 수많은 도전끝에 모두,,각자 구하는 함수를 하나씩 짜서 제출했지만 메모리초과가 나왔다.
그래서 중복된 과정을 제거 하는 방법을 모색하고,pypy가 아닌 Python으로 돌리니 됐당..젠쟝!
앞으로 파이썬으로간당!

핵심은 R,G는 탐색후 Rr로 변경해주고 B는 적록색약이나 아니나 동일하므로 따로 탐색해준다.
그렇게 적록색약이 아닌상태에서 탐색하면 Rr 와 B만 남는데 B는이미 알고 있으므로 Rr이 차지하는 구역의 갯수만을 다시 DFS로 구하면 된다.


큭,,,,참혹하ㅏㄷ..

profile
부족한 실력을 엉덩이 힘으로 채워나가는 개발자 서희찬입니다 :)

0개의 댓글