[Python] 10026 적록색약

·2024년 10월 8일

알고리즘 스터디

목록 보기
20/26

적록색약

문제

  • 그리드의 각 칸에 R, G, B 중 하나로 색칠한 그림이 있음
  • 그림은 몇 개의 구역으로 나뉨 -> 구역은 같은 색으로 이루어짐
  • 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속함

  • 이 예시에서는 적록색약이 아닌 사람이 봤을 때 구역은 4개 (빨2, 파1, 초1)
  • 적록색약인 사람은 3개 (빨-초 2, 파1)

입력

  • 첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)
  • 둘째 줄부터 N개 줄에는 그림이 주어진다.

출력

  • 적록색약이 아닌 사람이 본 구역의 개수, 적록색약인 사람이 본 구역의 개수
import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)

N = int(input())
A = []
A2 = []

for i in range(N):
    a = list(input().rstrip())
    A.append(a)
    A2.append([color for color in a])


for i in range(N):
    A2[i] = [color.replace('G', 'R') for color in A2[i]]

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

visited = [[0] * N for _ in range(N)]
visited2 = [[0] * N for _ in range(N)]

count = 0
count2 = 0


def dfs(x, y):
    visited[x][y] = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < N and 0 <= ny < N and not visited[nx][ny] and A[nx][ny] == A[x][y]:
            dfs(nx, ny)

def dfs2(x, y):
    visited2[x][y] = 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < N and 0 <= ny < N and not visited2[nx][ny] and A2[nx][ny] == A2[x][y]:
            dfs2(nx, ny)

for i in range(N):
    for j in range(N):
        if not visited[i][j]:
            dfs(i, j)
            count += 1

for i in range(N):
    for j in range(N):
        if not visited2[i][j]:
            dfs2(i, j)
            count2 += 1

print(count, count2)
  • 사실 통과될 줄 몰랐다 조금 바보같이 푼 것 같긴 한데
  • 전에 구역 나누는 기본 dfs 문제랑 같은 것 같다
    입력받을 때 변환시키려고 했는데 받고 나서 해서도 통과가 된다!!
    R이랑 G 같은 거 취급하고 똑같이 함수 돌리면 풀리는 문제
profile
꾸준히 공부하기

0개의 댓글