본문 바로가기
PS/DFS_BFS

[백준] 10026번: 적록색맹 파이썬

by 3급우사기 2024. 6. 25.

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문제 풀다보니까 점점 이해되고 통째로 외워지는 기분이든다.