-
[Python 3] BOJ - 10026 "적록 색약"BOJ 2020. 4. 2. 20:29
# 문제 링크 : https://www.acmicpc.net/problem/10026
10026번: 적록색약
문제 적록색약은 빨간색과 초록색의 차이를 거의 느끼지 못한다. 따라서, 적록색약인 사람이 보는 그림은 아닌 사람이 보는 그림과는 좀 다를 수 있다. 크기가 N×N인 그리드의 각 칸에 R(빨강), G(초록), B(파랑) 중 하나를 색칠한 그림이 있다. 그림은 몇 개의 구역으로 나뉘어져 있는데, 구역은 같은 색으로 이루어져 있다. 또, 같은 색상이 상하좌우로 인접해 있는 경우에 두 글자는 같은 구역에 속한다. (색상의 차이를 거의 느끼지 못하는 경우도 같은
www.acmicpc.net
# 풀이 :
이 문제는 단순히 BFS를 실행하면 되는 문제이다. 4방향으로 인접하면 같기 때문에 큐에 좌표를 넣고 행렬의 범위를 벗어나지 않고 적힌 글자가 같다면 그룹 번호를 갱신해주면 된다. 다만, 적록색약의 경우는 R과 G를 같다고 처리해주면 정답을 구할 수 있다.
# 코드
import sys, collections dx = [0,1,0,-1] dy = [1,0,-1,0] n = int(sys.stdin.readline()) # group : 해당 위치를 방문했는지 안했는지 체크하는 2차원 배열 group = [[False] * n for _ in range(n)] # board : 문제에서 주어지는 그리드의 상태 board = [list(sys.stdin.readline().rstrip()) for _ in range(n)] # bfs : 인접한 블록을 같은 구역으로 나눠주는 함수 def bfs(r, c): q = collections.deque() q.append((r,c)) group[r][c] = True while q: x, y = q.popleft() for i in range(4): nx, ny = x + dx[i], y + dy[i] if 0 <= nx < n and 0 <= ny < n: if group[nx][ny] == False and board[r][c] == board[nx][ny]: group[nx][ny] = group[x][y] q.append((nx, ny)) # init : group을 초기화 시켜주는 함수 def init(c): for i in range(n): for j in range(n): c[i][j] = False # normal : 정상인이 보는 그룹의 총 갯수 # abnormal : 색약인이 보는 그룹의 총 갯수 normal = 0 abnormal = 0 # 정상인의 경우 먼저 bfs 수행 for i in range(n): for j in range(n): # 아직 방문하지 않았다면 bfs if group[i][j] == False: normal += 1 bfs(i,j) # group 초기화 init(group) # 색약인의 경우, 그리드 상태 변경 for i in range(n): for j in range(n): if board[i][j] == 'R': board[i][j] = 'G' # 색약인의 경우 bfs 수행 for i in range(n): for j in range(n): if group[i][j] == False: abnormal += 1 bfs(i, j) # 정답 출력 print(normal, abnormal)
'BOJ' 카테고리의 다른 글
[Python 3] BOJ - 1002 "터렛" (0) 2020.04.07 [Python 3] BOJ - 13907 "세금" (0) 2020.04.03 [Python 3] BOJ - 9251 "LCS" (0) 2020.04.02 [Python 3] BOJ - 9095 "1,2,3 더하기" (0) 2020.04.01 [Python 3] BOJ - 6549 "히스토그램에서 가장 큰 직사각형" (0) 2020.04.01