본문 바로가기
알고리즘 풀이/백준

[백준 10026] 적록색약 (python)

by char_lie 2023. 5. 2.
반응형

https://www.acmicpc.net/problem/10026

 

10026번: 적록색약

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

www.acmicpc.net

적록색약 문제

RGB로 나누어진 영역의 개수와, 적록 색약이어서 RRB 혹은 GGB로만 볼 수 있을 때 나누어진 영역의 개수를 구하는 문제

BFS 개념을 이용해서 해결할 수 있었다.

📌 문제 접근 포인트

1. 나누어진 영역의 수를 구하기 위해서 BFS를 이용한 탐색을 진행해 주자, 진행 과정에서 방문 여부를 체크하기 위한 리스트를 하나 지정해 주자.
2. 처음 주어진 리스트를 이용해서 볼 수 있는 개수를 BFS를 이용해 체크해 주자.
3. 적록색약인 경우를 고려해서 G를 R로 바꾸거나 R을 G로 바꾸도록 리스트를 재구성해주고, 방문 여부도 다시 초기화해 주자.
4. 다시 똑같이 BFS를 이용해서 체크해 주고 결과를 출력하면 구현 성공

⚙ 내가 푼 정답 코드

def find(a,b): # 탐색
    visited[a][b] = 1
    queue = deque()
    queue.append([a,b])
    while queue:
        y, x = queue.popleft()
        for dy, dx in move :
            ny, nx = y + dy, x + dx
            if 0 <= ny < N and 0 <= nx < N and not visited[ny][nx]:
                if color[ny][nx] == color[y][x]:
                    visited[ny][nx] = 1
                    queue.append([ny,nx])

def check(): # 볼 수 있는 개수 세기
    cnt = 0
    for i in range(N):
        for j in range(N):
            if not visited[i][j] :
                find(i,j)
                cnt += 1
    return cnt

import sys
from collections import deque
move = [[0,1],[0,-1],[1,0],[-1,0]]
N = int(sys.stdin.readline())
color = [list(sys.stdin.readline().strip()) for _ in range(N)]
visited = [[0]*N for _ in range(N)]
result = check()

#적록색약
visited = [[0]*N for _ in range(N)] # 방문 체크 초기화
for i in range(N):
    for j in range(N):
        if color[i][j] == 'G':
            color[i][j] = 'R'
rgresult = check()
print(result, rgresult)
반응형

댓글