백준 10026

justhaza.log·2024년 3월 2일

알고리즘: BOJ

목록 보기
43/125

R, G, B로 이뤄진 n X n 그래프가 주어질 때,
R, G, B 3가지로 구분된 영역의 개수와,
R/G, B 2가지로 구분된 영역의 개수를 구하는 문제이다.


그래프 탐색이라 DFS로 풀었다.

지금까지 풀었던 DFS와 다른 점이라 하면..
0과 1 같은 2개의 값으로 구성된 그래프가 아니라,
R, G, B라는 3개의 문자로 구성된 그래프라는 것이다.


적록 색약인 경우는 이전에 풀었던 DFS와 같지만,
적록 색약이 아닌 경우를 위해 visited라는 리스트를 뒀다.

그리고 아래의 2가지 조건을 만족하는 경우에만 재귀 탐색을 하도록 했다.
1) 탐색하려는 좌표가 아직 방문되지 않았다. (visited 값이 False)
2) 탐색하려는 좌표가 현재 좌표와 색이 같다.


# 10026

import sys

sys.setrecursionlimit(10000)

def dfs(x, y):
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]

    visited[x][y] = True

    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]:
                if graph[ny][nx] == graph[y][x]:
                    dfs(nx, ny)


n = int(sys.stdin.readline())

graph = []
for _ in range(n):
    graph.append(list(sys.stdin.readline().rstrip()))

# 1. 적록 색약이 아닌 사람
visited = [[False for _ in range(n)] for _ in range(n)]
cnt = 0
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            dfs(i, j)
            cnt += 1

print(cnt)

# 2. 적록 색약인 사람
for i in range(n):
    for j in range(n):
        if graph[j][i] == 'R':
            graph[j][i] = 'G'

visited = [[False for _ in range(n)] for _ in range(n)]
cnt = 0
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            dfs(i, j)
            cnt += 1

print(cnt)
profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글