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

쉽다.
그냥 bfs를 두번 쓰면된다.
근데 적록색맹인 경우를 처리하는 방법이 여러가지일거같은데
그냥 배열에서 R을 G로 바꿔버린 후 bfs를 하는 방법도있고....
나는 그냥 bfs에 조건 추가해서 구현했다.
import sys
from collections import deque
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def bfs(a, b, check):
q = deque()
q.append((a, b))
dis[a][b] = 1
while q:
x, y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < n and dis[nx][ny] == -1:
if arr[nx][ny] == arr[x][y]:
dis[nx][ny] = 1
q.append((nx, ny))
if check == 1:
if (arr[nx][ny] == 'R' and arr[x][y] == 'G') or (arr[nx][ny] == 'G' and arr[x][y] == 'R'):
dis[nx][ny] = 1
q.append((nx, ny))
n = int(sys.stdin.readline())
arr = [list(map(str, list(sys.stdin.readline().strip()))) for _ in range(n)]
dis = [[-1 for _ in range(n)] for _ in range(n)]
count = 0
count_b = 0
for i in range(n):
for j in range(n):
if dis[i][j] == -1:
bfs(i, j, 0)
count += 1
print(count, end=' ')
dis = [[-1 for _ in range(n)] for _ in range(n)]
for i in range(n):
for j in range(n):
if dis[i][j] == -1:
bfs(i, j, 1)
count_b += 1
print(count_b)
계속 bfs문제 풀다보니까 점점 이해되고 통째로 외워지는 기분이든다.
'PS > DFS_BFS' 카테고리의 다른 글
[백준] 2206번: 벽 부수고 이동하기 파이썬 (0) | 2024.06.26 |
---|---|
[백준] 7562번: 나이트의 이동 (0) | 2024.06.26 |
[백준]4179번: 불! 파이썬 (0) | 2024.06.25 |
[백준] 2667번: 단지번호붙이기 파이썬 (0) | 2024.06.25 |
[백준] 7569번: 토마토(3차원) 파이썬 (0) | 2024.06.24 |