티스토리 뷰

알고리즘

[백준 10026 / Python] 적록색약

lemonade99 2023. 8. 25. 22:32

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

 

10026번: 적록색약

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

www.acmicpc.net

 

접근 방식

같은 색상이 상하좌우로 인접한 경우에 두 글자는 같은 구역에 속한다.

-> 상하좌우 리스트를 만들어서 bfs를 이용해 같은 구역을 추출한다.

-> 그림 안에서  bfs로 방문표시와 함께 같은 구역을 추출해 크게 구역을 나눈다.

 

적록색약인 경우 그림에서 R과 G를 같게 설정한뒤 bfs를 통해 구역을 나눈다.

-> 위에서 썼던 방문표시리스트를 초기화해서 bfs를 돌아 구역을 나눈다.

 

구역을 나누면서 나눈 구역을 카운트해 구역개수를 센다.

 

 

풀이 코드

import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
arr = list(input().strip() for _ in range(n))
visited = [[0]*n for _ in range(n)]
cnt_1=0 # 정상인 사람이 봤을때 구역 수
cnt_2=0 # 적록색약인 사람이 봤을때 구역 수
def bfs(a,b):
    dx = [-1,+1,0,0]
    dy = [0,0,-1,+1]
    queue = deque()
    queue.append([a,b])
    visited[a][b]=1
    while queue:
        x,y = queue.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx < 0 or nx >= n or ny < 0 or ny >= n:
                continue
            if not visited[nx][ny] and arr[x][y]==arr[nx][ny]: #같은 색깔일때
                visited[nx][ny]=1
                queue.append([nx, ny])

    return

for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            bfs(i,j)
            cnt_1+=1

visited = [[0]*n for _ in range(n)]


for i in range(n):
    arr[i] = arr[i].replace('R','G')


for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            bfs(i, j)
            cnt_2 += 1

print(cnt_1,end=' ')
print(cnt_2)

 

 

'알고리즘' 카테고리의 다른 글

[백준 2096 / Python] 내려가기  (0) 2023.08.31
[백준 1520 / Python] 내리막 길  (0) 2023.08.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함