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

# https://www.acmicpc.net/problem/10026
# BFS
from collections import deque, defaultdict
N = int(input())
MAP = []
RGB = defaultdict(list)
for n in range(N+2) :
if n == 0 or n == N+1 :
MAP.append('0'*(N+2))
continue
line = input()
for idx, l in enumerate(line) :
if l == 'R' :
RGB['R'].append((n-1, idx))
elif l == 'G' :
RGB['G'].append((n-1, idx))
else :
RGB['B'].append((n-1, idx))
line = '0' + line + '0'
MAP.append(line)
# graph
X_graph = defaultdict(list) # 적록색약 아닌 사람
O_graph = defaultdict(list) # 적록색약인 사람
dx = [0, 0, -1, 1] # 상 하 좌 우
dy = [-1, 1, 0, 0] # 상 하 좌 우
for i in range(1, N+1) :
for j in range(1, N+1) :
now = MAP[i][j]
now_is_red_or_green = now == 'R' or now == 'G'
for idx in range(4) :
new_i = i + dy[idx]
new_j = j + dx[idx]
if MAP[new_i][new_j] == now :
# 적록색약 아닌 경우
O_graph[(i-1, j-1)].append((new_i-1, new_j-1))
# 적록색약인 경우
X_graph[(i-1, j-1)].append((new_i-1, new_j-1))
else :
# 적록색약인 경우
if now_is_red_or_green and (MAP[new_i][new_j] == 'R' or MAP[new_i][new_j] == 'G') :
O_graph[(i-1, j-1)].append((new_i-1, new_j-1))
# BFS
def BFS(start, num_group, graph, visited) :
q = deque([start])
visited[start[0]][start[1]] = 1
while q :
u = q.popleft()
for v in graph[u] :
if visited[v[0]][v[1]] == 0 :
q.append(v)
visited[v[0]][v[1]] = 1
return num_group + 1
X_visited = [[0 for _ in range(N)] for _ in range(N)]
O_visited = [[0 for _ in range(N)] for _ in range(N)]
X_num_group = 0
O_num_group = 0
for rgb in ['R', 'G', 'B'] :
for item in RGB[rgb] :
if X_visited[item[0]][item[1]] == 0 :
X_num_group = BFS(item, X_num_group, X_graph, X_visited)
if O_visited[item[0]][item[1]] == 0 :
O_num_group = BFS(item, O_num_group, O_graph, O_visited)
print(X_num_group, O_num_group)
아이디어
- RGB에 따라 위치를 저장하는 dictionary로 start 위치를 지정한다.
- 적록색약인 사람을 위한 graph, 적록색약이 아닌 사람을 위한 graph를 각각 저장한다.
- 적록색약인 사람과 아닌 사람에 따라 달라지는 탐색 방법(BFS)을 구현한다.
- 적록색약인 사람이 인식하는 블럭 단위를 계산하는 변수와, 아닌 사람이 인식하는 변수를 각각 지정하고 따로 저장한다.
'코테풀이 > 백준' 카테고리의 다른 글
| 2533번: 사회망 서비스(SNS) (0) | 2025.10.01 |
|---|---|
| 7569번: 토마토 (0) | 2025.09.24 |
| 14502번: 연구소 (0) | 2025.09.13 |
| 1753번: 최단경로 (0) | 2025.09.10 |
| 1697번 : 숨바꼭질 (0) | 2025.09.09 |