[백준]10026(파이썬) - 적록색약

resilient

·

2021. 7. 22. 13:40

728x90
반응형

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

 

10026번: 적록색약

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

www.acmicpc.net

  • 이 문제는 단지번호 붙이기와 비슷한 문제이다.
  • DFS를 사용해서 풀었고 색맹일 경우와 색맹이 아닐 경우를 나눠서 풀었다.
  • 색맹이 아닐경우는 문제가 없지만 색맹일 경우 R과 G는 구별하지 못하므로 같은 색으로 인지하고 B와 나머지를 구별해주면 되는 문제였는데, DFS함수안에 if문으로 처리를 해줄까 하다가 그냥 R이나오면 G로 바꾸고(G가 나오면 R로 바꿔도 문제없다.) G와 B로 만이루어진 배열을 만들어서 색맹이 아닌경우의 함수와 비슷하게 구현해서 문제를 해결했다.
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10001)
n = int(input())
data = [list(input().rstrip()) for _ in range(n)]
temp_data = data
dx = [0,0,1,-1]
dy = [1,-1,0,0]

#색맹아님
def not_cb_dfs(x,y):
    not_cb_visited[x][y] = 1 # 방문처리하고
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<= nx < n and 0<= ny < n:
            if data[nx][ny] == data[x][y] and not_cb_visited[nx][ny] == 0:
                not_cb_dfs(nx,ny)

#색맹임
def cb_dfs(x,y):
    cb_visited[x][y] = 1 # 방문처리하고
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<= nx < n and 0<= ny < n:
            if temp_data[nx][ny] == temp_data[x][y] and cb_visited[nx][ny] == 0:
                cb_dfs(nx,ny)
 
###############
#색맹아닌사람
not_cb_visited = [[0]*n for _ in range(n)]
not_cb_cnt = 0

for i in range(n):
    for j in range(n):
        if not_cb_visited[i][j]==0:
            not_cb_dfs(i,j)
            not_cb_cnt += 1
################################################################
#색맹인사람
#G가나오면 R로 다 바꿔서 색맹이 아닌사람DFS함수랑 비슷하게 풀어주면된다.
for i in range(n):
    for j in range(n):
        if temp_data[i][j]=='G':
            temp_data[i][j] = 'R'

cb_visited =[[0]*n for _ in range(n)]
cb_cnt = 0
for i in range(n):
    for j in range(n):
        if cb_visited[i][j]==0:
            cb_dfs(i,j)
            cb_cnt += 1

print(not_cb_cnt,cb_cnt)
반응형