티스토리 뷰

 

10026번: 적록색약

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

www.acmicpc.net

좀 더 클린한 코드로 리팩토링이 필요해보이나, List와 DFS 개념을 활용하여 해결하였다.

 

방문 배열을 만들어주고, 정상인의 경우와 적녹색약인 경우 각각의 함수를 정의하지 않고, 정상인일 경우를 해결한 후적색을 녹색으로 변경하여 다시 한번 깊이 우선 탐색을 돌려주었다.

import sys
sys.setrecursionlimit(10 ** 9)

n = int(input())
arr = list()
for _ in range(n):
    arr.append(list(input()))
    
# 정상인의 경우, 색을 따로 구분
visit = [[False for _ in range(n)] for _ in range(n)]
normal = 0

def dfs(x, y, c):
    global arr
    visit[x][y] = True
    
    if x - 1 >= 0:
        if arr[x - 1][y] == c and not visit[x - 1][y]:
            dfs(x-1, y, c)
    if x + 1 < n:
        if arr[x + 1][y] == c and not visit[x + 1][y]:
            dfs(x+1, y, c)
    if y - 1 >= 0:
        if arr[x][y - 1] == c and not visit[x][y - 1]:
            dfs(x, y-1, c)
    if y + 1 < n:
        if arr[x][y + 1] == c and not visit[x][y + 1]:
            dfs(x, y+1, c)

for i in range(n):
    for j in range(n):
        if not visit[i][j]:
            normal += 1
            dfs(i, j, arr[i][j])

# 적녹색약인 경우, 녹색이나 적색을 서로의 색을 바꾸어준다
for i in range(n):
    for j in range(n):
        if arr[i][j] == 'R':
            arr[i][j] = 'G'

visit = [[False for _ in range(n)] for _ in range(n)]
obs = 0

for i in range(n):
    for j in range(n):
        if not visit[i][j]:
            obs += 1
            dfs(i, j, arr[i][j])

print(normal, obs)
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
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
글 보관함