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 |