[백준/Python] 10026번 적록색약

너비 우선 탐색, 깊이 우선 탐색, 그래프 이론, 그래프 탐색 문제로 DFS로 풀어보았습니다.
Apr 07, 2024
[백준/Python] 10026번 적록색약

알고리즘 설명

이 문제는 그래프 탐색 문제로, 각 칸을 그래프의 노드로, 인접한 칸을 연결된 노드로 간주하여 해결할 수 있다.

DFS(깊이 우선 탐색)는 시작 노드에서 가장 멀리 있는 노드를 우선적으로 탐색하는 방식이다. 스택을 사용하여 구현할 수 있으며, 이 문제에서는 스택에 현재 위치를 넣고, 스택이 비어있지 않는 동안 계속해서 스택의 마지막 요소를 꺼내어 그 위치의 인접한 위치를 탐색합니다.

이 문제에서는 같은 색상의 영역을 찾는 것이 목표이므로, 같은 색상의 인접한 칸을 DFS로 탐색하여 같은 색상의 영역을 찾는다. 이렇게 하면 적록색약인 사람과 아닌 사람이 보는 그림의 차이를 구할 수 있다.

문제

적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다.

크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상이라 한다)

예를 들어, 그림이 아래와 같은 경우에

RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

적록색약이 아닌 사람이 봤을 때 구역의 수는 총 4개이다. (빨강 2, 파랑 1, 초록 1) 하지만, 적록색약인 사람은 구역을 3개 볼 수 있다. (빨강-초록 2, 파랑 1)

그림이 입력으로 주어졌을 때, 적록색약인 사람이 봤을 때와 아닌 사람이 봤을 때 구역의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N이 주어진다. (1 ≤ N ≤ 100)

둘째 줄부터 N개 줄에는 그림이 주어진다.

출력

적록색약이 아닌 사람이 봤을 때의 구역의 개수와 적록색약인 사람이 봤을 때의 구역의 수를 공백으로 구분해 출력한다.

문제 접근

  • 일단 stack으로 위치를 저장하고 pop, append하는 아이디어는 gpt가 알려줬다. 원래는 현재 위치를 저장하고 업데이트하는 아이디어로 접근했는데 재귀 깊이 문제로 잘 안 풀렸다… 다른 사람 풀이 중에서 재귀 깊이를 정할 수 있다는 것을 알았음.

  • 전에 DFS 문제 풀 때 북, 동, 남, 서 방향을 함수로 만들어서 0, 1, 2, 3으로 아웃풋 내줘서 방향벡터 dx[d], dy[d] 이런 식으로 풀었다.

  • 근데 for문의 반복 변수 i로 방향 벡터로 탐색할 방향을 처리할 수 있다는 것을 알게 되었음

문제 풀이

  • dfs 함수는 x, y 좌표와 해당 처리할 color를 매개변수로 받는다.

  • stack에 위치를 저장하고 stack이 비어있지 않는 동안 반복한다.

  • 해당 위치의 북, 동, 남, 서 방향으로 nx, ny가 범위 내에 있고, 방문하지 않았으며, 색깔이 같다면 stack에 nx, ny를 저장한다.

  • count_regions함수는 color를 받아서 방문하지 않았고, 매개변수로 받은 색깔이 현재 위치 array[i][j]와 같다면 dfs를 탐색하고, count를 한다. 그리고 count를 반환한다.

  • 그래서 sum1은 count_resions에 R, G, B를 카운트한 합계를 저장하고

  • sum2는 visited 변수를 초기화하고, G를 R로 array를 업데이트 한 후 카운트한 합계를 저장한다.

Share article

code-with-me