[백준]10026(파이썬) - 적록색약
resilient
·2021. 7. 22. 13:40
728x90
반응형
https://www.acmicpc.net/problem/10026
- 이 문제는 단지번호 붙이기와 비슷한 문제이다.
- 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)
반응형
'자료구조 & 알고리즘 > 백준(Baekjoon)' 카테고리의 다른 글
[백준] 1987(파이썬) - 알파벳 (0) | 2021.07.25 |
---|---|
[백준]11048(파이썬) - 이동하기 (0) | 2021.07.24 |
[백준]1068(파이썬) - 트리 (0) | 2021.07.20 |
[백준]1058(파이썬) - 친구 (0) | 2021.07.19 |
백준6064(파이썬) - 카잉 달력 (0) | 2021.07.18 |