from collections import deque def bfs(x,y,color): global N stack = deque() stack.append((x,y)) if color == 'B': chk = 2 else: chk = 3 visited[x][y] = chk while stack: x,y = stack.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0<=nx<N and 0<=ny<N: if not visited[nx][ny] and arr[nx][ny] == color: visited[nx][ny] = chk stack.append((nx,ny)) def new_bfs(x,y,chk): global N stack = deque() stack.append((x,y)) visited[x][y] = 0 while stack: x,y = stack.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] if 0 <=nx<N and 0<=ny<N: if visited[nx][ny] == chk: visited[nx][ny] = 0 stack.append((nx,ny)) N = int(input()) arr = [list(input()) for _ in range(N)] dx = [-1,1,0,0] dy = [0,0,-1,1] visited = [[0]*N for _ in range(N)] cnt_a = 0 cnt_b = 0 for x in range(N): for y in range(N): if not visited[x][y]: bfs(x,y,arr[x][y]) cnt_a += 1 for x in range(N): for y in range(N): if visited[x][y]: new_bfs(x,y,visited[x][y]) cnt_b += 1 print(cnt_a,cnt_b)
2개의 BFS로 나누어, 3개의 색으로 구분할때와 2가지 색으로 구분할때 나눠서 탐색해주면 된다.
여기서 별다른 건 없고, visited 라는 리스트를 두번 만드는게 싫어서, 첫번째 bfs에서 visited에 체크하는 숫자를 청색 vs 녹색,빨간색을 서로 다르게 해주었고,
두번째 bfs에서는 원본 배열이 아닌 visited 함수를 통해 bfs를 돌려주었다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 2225 합분해 (0) | 2021.02.16 |
---|---|
[BOJ/백준] 3190 뱀 (0) | 2021.02.16 |
[BOJ/백준] 14503 로봇 청소기 (0) | 2021.02.16 |
[BOJ/백준] 16946 벽 부수고 이동하기 4 (0) | 2021.02.16 |
[BOJ/백준] 1937 욕심쟁이 판다 (0) | 2021.02.16 |