728x90
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)
728x90
'PS (Problem Solving)' 카테고리의 다른 글
[BOJ, Swift] 17298 - 오큰수 ( with 스택 ) (0) | 2022.09.16 |
---|---|
[BOJ, Swift] 1786 - 찾기 ( with KMP 알고리즘 ) (0) | 2022.09.13 |
[BOJ, Swift] 1021 - 회전하는 큐 ( with 덱(Dequeue) ) (0) | 2022.08.13 |
[BOJ, Python] 람다(lambda)를 활용한 리스트 정렬 (0) | 2022.07.24 |
[BOJ, Swift] 18258 - 큐 2 (0) | 2022.07.22 |