코딩 테스트/백준
[Python] 백준 10026 적록색약
위시리
2025. 2. 11. 17:36
문제 분석
- 정사각형 그림
- 그리드 안 r, g, b
- 그림은 몇 개의 구역으로 나뉘어져 있고, 해당 구역은 같은 색으로 이루어져 있다.
- 상하좌우로 인접한 경우 같은 구역 (색상의 차이를 거의 느끼지 못하는 경우도 같은 색상)
- 적록색약은 빨간색(r)과 초록색(g)의 차이를 거의 느끼지 못한다.
- 적록색약 / 아닌 사람이 보는 구역의 수
코드 설계
- 적록 색약이 아닌 사람은 r != g
- 적록 색약은 r == g
- 아직 방문하지 않은 칸이 나오면 덱에 append → 새롭게 찾을 때마다 구역 +1
- 적록색약 x
- 범위를 벗어나지 않고
- 아직 방문하지 않고
- 같은 색이면
- 덱에 추가 & 방문 표시
- 적록색약
- 먄약 현재 색이 B이면 : B가 아닌 색으로는 갈 수 x
- 현재 색이 R or G 이라면 B인 경우에만 갈 수 없다.
정답 코드
import sys
input = sys.stdin.readline
from collections import deque
n = int(input())
g = [list(input().strip()) for _ in range(n)]
v_nor = [[False] * n for _ in range(n)]
v_blind = [[False] * n for _ in range(n)]
# 이동방향 - 상하좌우
dh = [-1, 1, 0, 0]
dw = [0, 0, -1, 1]
d_nor = deque()
d_blind = deque()
zone_nor = 0
zone_blind = 0
# 적록색약 x
for i in range(n) :
for j in range(n) :
if not v_nor[i][j] : # 아직 방문하지 않은 이전과 다른 색을 찾으면
d_nor.append((i,j))
v_nor[i][j] = True
zone_nor += 1
while d_nor : # 같은 색 찾기
h, w = d_nor.popleft()
now_color = g[h][w] # 현재 색깔
for k in range(4) :
nh = h + dh[k]
nw = w + dw[k]
if nh < 0 or nh >= n or nw < 0 or nw >= n :
continue
if v_nor[nh][nw] :
continue
if g[nh][nw] != now_color :
continue
d_nor.append((nh, nw))
v_nor[nh][nw] = True
# 적록 색약
for i in range(n) :
for j in range(n) :
if not v_blind[i][j] :
d_blind.append((i,j))
v_blind[i][j] = True
zone_blind += 1 # 새로운 색을 찾으면
while d_blind :
h, w = d_blind.popleft()
now_color = g[h][w]
for k in range(4) :
nh = h + dh[k]
nw = w + dw[k]
if nh < 0 or nh >= n or nw <0 or nw >= n :
continue
if v_blind[nh][nw] :
continue
# '현재 색이 파랑색일 때는 다른 색으로 볼 수 없다.
if now_color == 'B' :
if g[nh][nw] != 'B' :
continue
# 현재 색이 빨강 or 초록일 때 파랑이 아니면 된다.
if now_color == 'R' :
if g[nh][nw] == 'B' :
continue
if now_color == 'G' :
if g[nh][nw] == 'B' :
continue
d_blind.append((nh, nw))
v_blind[nh][nw] = True
print(zone_nor, zone_blind)