하루일문

[백준] 10026번 적녹색약 (파이썬) 본문

algorithm/baekjoon

[백준] 10026번 적녹색약 (파이썬)

support_u 2023. 3. 22. 10:03

문제

 

10026번: 적록색약

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

www.acmicpc.net

코드

dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline

def DFS(graph, visited, i, j):
  visited[i][j] = 1

  for _ in range(4):
    nx = i + dx[_]
    ny = j + dy[_]

    if 0 <= nx < N and 0 <= ny < N and graph[i][j] == graph[nx][ny] and not visited[nx][ny]:
      DFS(graph, visited, nx, ny)

N = int(input())

graph = [list(input().strip()) for _ in range(N)]
visited = [[0] * N for _ in range(N)]
visited_2 = [[0] * N for _ in range(N)]

cnt = 0
for i in range(N):
  for j in range(N):
    if not visited[i][j]:
      DFS(graph, visited, i, j)
      cnt += 1

for i in range(N):
  for j in range(N):
    if graph[i][j] == "G":
      graph[i][j] = "R"

cnt_2 = 0
for i in range(N):
  for j in range(N):
    if not visited_2[i][j]:
      DFS(graph, visited_2, i, j)
      cnt_2 += 1
print(cnt, cnt_2)

해설

DFS로 풀었다.

위에서 전체로 나뉘는 부분을 구했다.

다른방법을 고민해 봤지만 초록을 빨강으로 바꿔주고 다시 돌아주는게 좋을 것 같아서 바꾸고 똑같이 돌아줬다.