[baekjoon] 적록 색약

김민서·2024년 1월 16일
0

알고리즘 문제풀이

목록 보기
36/47

링크텍스트

코딩 테스트 2번 문제였고 풀지 못하였다.
NxN 그래프가 주어졌을 때, 구역의 개수를 세는 문제이다.
단, 적록 색약이 아닌 사람이 그래프를 봤을 때와, 적록 색약인 사람이 그래프를 봤을 때 각각 구역의 개수가 몇개로 보이는 지 다르기 때문에 이를 차례로 출력하면 된다.
적록 색약은 빨간색과 초록색의 차이를 거의 느끼지 못하는 것을 말한다. (R이 G으로 보임)

<적록 색약이 아닌 사람이 봤을 때> 구역 개수: 4
RRRBB
GGBBB
BBBRR
BBRRR
RRRRR

<적록 색약인 사람이 봤을 때> 구역 개수: 3
GGGBB
GGBBB
BBBGG
BBGGG
GGGGG

from collections import deque
n = int(input())

# 원래 그래프
graph = [input() for _ in range(n)] 

# 적록 색약인 사람에게 보이는 그래프
new_graph = [line.replace('R', 'G') for line in graph]

def count_section(graph):
	count = 0
    
    # 상하좌우로 탐색할 좌표 차
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    
    # 방문 여부 표시
    visited = set()
    
    # 그래프 탐색
    for x in range(n):
    	for y in range(n):
    		if (x, y) not in visited:
            	count += 1
                queue = deque([(x, y)])
                visited.add((x, y))
                
                color = graph[x][y] 	# 현재 색깔을 기준으로 탐색
                
                # 그 색깔과 같은 애들을 탐색한다. (큐가 비워질 때까지가 한 사이클.)
                while queue:
                	popped_x, popped_y = queue.pop()
                    # 4방향으로 탐색
                    for i in range(4):
                    	nx = popped_x + dx[i]
                        ny = popped_y + dy[i]
                        
                        if 0 <= nx < n and 0 <= ny < n:
                        	if (nx, ny) not in visited and graph[nx][ny] == color:
                            queue.appendleft((nx, ny))
                            visited.add((nx, ny))
    return count

print(count_section(graph), count_section(new_graph))
                    

0개의 댓글