알고리즘/백준

10026.적록색약

1.5볼트 2023. 3. 23. 18:37
728x90

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

 

10026번: 적록색약

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

www.acmicpc.net

 

일반적인 bfs 문제
2차원 이상 행렬이 주어지고 어디 길을 찾던지 섬의 개수 그런 거 이런 모든 형태에 적용하는 하다 이게 알고리즘의 힘인가 어쨌든 토마토에게 고마워하자


다른 건 다 같은데 2가지 경우라 리스트도 2개 만들었다 지나가면서 길에 x 표시를 하는 거라 2번 돌리면 맵이 망가져있어서 2개로 해줘야 함 그리고 색칠한 부분의 개수니까 그냥 한 번이라도 함수가 실행되면 한 개의 구역이 생긴다 섬의 개수 구하기와 같네 아 그리고 제일위에  sys.setrecursionlimit 는 파이썬에서 재귀함수의 깊이 제한이 있어서 그걸 해제하려고 한거다 

import sys
sys.setrecursionlimit(10**6)

n=int(input())
t1=[]
t=[]
for i in range(n):
    a=input()
    t1.append(list(a))
    t.append(list(a))
def f(x,y,c):
    for i,j in [[1,0],[-1,0],[0,1],[0,-1]]:
        if 0<=x+i<n and 0<=y+j<n and t[x+i][y+j] in c:
            t[x+i][y+j]='x'
            f(x+i,y+j,c)
s=0
for i in range(n):
    for j in range(n):
        if t[i][j]!="x":
            s+=1
            f(i,j,t[i][j])
            t[i][j]="x"
s1=0
t=t1
for i in range(n):
    for j in range(n):
        if t[i][j]!="x":
            s1+=1
            if t[i][j]=="B":
                f(i,j,"B")
            else:
                f(i,j,"RG")
            t[i][j]="x"
print(s,s1)