BOJ - 10026

주의·2024년 2월 7일
0

boj

목록 보기
199/214

백준 문제 링크
적록색약

❓접근법

  1. BFS를 사용했다.
  2. BFS 함수를 만들건데,
    다음 좌표가 범위 안에 있고, 방문 전이고,
    다음 좌표의 색깔과 현재 좌표의 색깔이 같을 때만
    방문처리하고 큐에 넣는 함수를 만들어야한다.
  3. 이제 적록색약이 아닐 때와 적록색약일 때를 구분해야 한다.
  • 적록색약이 아닐때는 visited 를 만들고,
    좌표에 아직 방문하지 않았다면 함수를 실행시키고,
    cnt1 + 1 해준다.
  • 적록색약일 때는 visited를 만들고,
    G를 R로 바꿔줘야한다.
    색깔을 바꾼 뒤 위의 방식처럼
    좌표에 아직 방문하지 않았다면 함수를 실행시키고,
    cnt2 + 1 해준다.
  1. print(cnt1, cnt2) 끝!

👌🏻코드

from collections import deque

n = int(input())

graph = []
for _ in range(n):
    graph.append(list(input()))
    
def RGB(x, y):
    queue = deque()
    queue.append((x, y))
    
    visited[x][y] = True
    
    dx = [0, 0, 1, -1]
    dy = [1, -1, 0, 0]
    
    while queue:
        
        x, y = queue.popleft()
        
        for d in range(4):
            nx = x + dx[d]
            ny = y + dy[d]
            
            if (0 <= nx < n) and (0 <= ny < n):
                if not visited[nx][ny] and graph[nx][ny] == graph[x][y]: # 색깔이 같을 때 
                    visited[nx][ny] = True
                    queue.append((nx, ny))

cnt1, cnt2 = 0, 0

# 적록색약 아닐 때 
visited = [[False] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            RGB(i,j)
            cnt1 += 1
            
# 적록색약 일 때
visited = [[False] * n for _ in range(n)]
for i in range(n):
    for j in range(n):
        if graph[i][j] == 'G':
            graph[i][j] = 'R'
            
for i in range(n):
    for j in range(n):
        if not visited[i][j]:
            RGB(i,j)
            cnt2 += 1
            
print(cnt1, cnt2)

0개의 댓글