처음 이 문제를 풀었을 때,
런타임 에러가 떴다.
테스트 케이스는 통과했는데 런타임 에러가 뜨는 경우는,
인덱스 설정을 잘못 했을 경우가 많다는 것을 경험적으로 알고 있었기에,
여기저기 찾아봤지만 아무리 찾아봐도 잘못된 점이 없었다.
그러던 중 n이 100까지 갈 수 있다는 것을 알게 되었고,
혹시 최대 리커젼 가능 횟수에 걸린 것이 아닐까 하는 생각이 들었다.
파이썬은 최대 리커젼 가능 횟수가 1000회로 디폴트값이 설정되어있기 때문에,
이 이상의 재귀를 돌릴라면, 이를 인위적으로 바꿔주는 코드가 필요하다.
역시나, 이를 바꿔주니 해결되었다.
# n 입력
n = int(input())
# grid 설계
grid = [
[0] * n
for _ in range(n)
]
# grid 채워넣기
for i in range(n):
color = input()
for j in range(len(color)):
# B -> 0, R -> 1, G -> 2
if color[j] == 'R':
grid[i][j] = 1
elif color[j] == 'G':
grid[i][j] = 2
# in_range(x, y)
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
# check_1(x, y, c) -> 적록색약이 아닌 사람용
def check_1(x, y, c):
# 격자 내에 없으면,
if not in_range(x, y):
# 탈락
return False
# 방문한 적 있으면,
if visited[x][y]:
# 탈락
return False
# 색깔이 다르면,
if grid[x][y] != c:
# 탈락
return False
# 이외엔 통과
return True
# dfs_1(x, y, c) -> 적록색약이 아닌 사람용
def dfs_1(x, y, c):
# dxs, dys -> 상 하 좌 우 순서 상관 x
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
for dx, dy in zip(dxs, dys):
# 조사 위치
nx, ny = x + dx, y + dy
# 조사 위치가 갈 수 있는 위치면
if check_1(nx, ny, c):
# 방문 표시 해 주고,
visited[nx][ny] = 1
# 다음 위치에서 dfs 호출
dfs_1(nx, ny, c)
# check_2(x, y, c) -> 적록색약인 사람용
def check_2(x, y, c):
# 격자 내에 없으면
if not in_range(x, y):
# 탈락
return False
# 방문한 적 있으면
if visited[x][y]:
# 탈락
return False
# 현재 색이 빨강이거나 초록인데,
# 가고자 하는 색이 파랑이면,
if (c == 1 or c == 2) and not grid[x][y]:
# 탈락
return False
# 현재 색이 파랑인데,
# 가고자 하는 색이 빨강이거나 초록이여도,
if c == 0 and grid[x][y]:
# 탈락
return False
# 나머지는 통과
return True
# dfs_2(x, y, c) -> 적록색약인 사람용
def dfs_2(x, y, c):
# dxs, dys -> 상 하 좌 우 순서 상관 x
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
for dx, dy in zip(dxs, dys):
# 조사 위치
nx, ny = x + dx, y + dy
# 조사 위치가 갈 수 있는 위치면
if check_2(nx, ny, c):
# 방문 표시 해 주고
visited[nx][ny] = 1
# 다음 위치에서 dfs 호출
dfs_2(nx, ny, c)
# 설계
# 최대 리커젼 가능 횟수 올려주기
import sys
sys.setrecursionlimit(15000)
# visited 설계
visited = [
[0] * n
for _ in range(n)
]
# 1. 적록색약이 아닌 사람이 봤을 때 구역의 수 구하기
# 구역 개수
area_num = 0
# visited 돌면서
for i in range(n):
for j in range(n):
# 방문한 적 없는 칸이면,
if not visited[i][j]:
# 구역 개수 추가해주고,
area_num += 1
# 방문 기록 해 주고,
visited[i][j] = 1
# dfs 호출
dfs_1(i, j, grid[i][j])
# 출력
print(area_num, end=' ')
# 2. 적록색약인 사람이 봤을 때 구역의 수 구하기
# visited 초기화
visited = [
[0] * n
for _ in range(n)
]
# 구역 개수
area_num = 0
# visited 돌면서
for i in range(n):
for j in range(n):
# 방문한 적 없는 칸을 만나면
if not visited[i][j]:
# 구역 개수 추가해주고,
area_num += 1
# 방문 기록 해 주고,
visited[i][j] = 1
# dfs 호출
dfs_2(i, j, grid[i][j])
# 출력
print(area_num)
'Algorithm(BOJ, Python) > BFS&DFS' 카테고리의 다른 글
[백준_1987] 알파벳 python (0) | 2022.08.19 |
---|---|
[백준_7576] 토마토 python (0) | 2022.08.18 |
[백준_14502] 연구소 python (0) | 2022.08.15 |
[백준_7562] 나이트의 이동 python (0) | 2022.08.13 |
[백준_2178] 미로탐색 python (0) | 2022.08.12 |