티스토리 뷰
DFS를 공부하면서 관련 문제를 풀어보는데 분명 vscode에서 실행해보면 답은 제대로 나오는데 백준에서 제출하면 런타임 에러가 발생했다. 👿
하루코딩에서 풀이해주는 영상도 보았는데 코드에는 틀린 부분은 없는 것 같았다.
그래서 구글링해보니 파이썬에서는 재귀의 최대 깊이의 기본 설정이 1,000회로 설정되어있어서 재귀를 사용하는 경우에 런타임 에러가 발생하는 경우가 있다고 한다.
그래서 아래 코드와 같이 작성하면 재귀의 깊이를 변경해주면 에러를 해결할 수 있다. 괄호 안의 숫자를 필요에 따라 다르게 설정하면 된다.
import sys
sys.setrecursionlimit(10 ** 6)
그런데 나는 위 코드를 추가해주었는데도 런타임에러가 발생하였다. setrecursionlimit의 숫자를 높여도 런타임 에러가 해결이 안되어서 다른 방법을 찾아보았다.
파이썬을 사용할 때 여러 줄 입력을 받는다면 그냥 input() 함수를 사용하는 것 보다 sys.stdin.readline을 사용하는 것이 시간과 메모리 측면에서 효율이 좋다고 한다.
그래서 추가로 input()으로 받던 입력을 모두 sys.stdin.readline()으로 변경해주었다.
💡 sys.stdin.readline() 주의할 점
sys.stdin.readline()은 한 줄 단위로 입력받기 때문에 개행문자(\n)이 함께 받아진다.
예를 들어, 2를 입력받았다면 실제 값으로는 2\n이 입력되기 때문에 개행문자를 제거해야 한다.
최종적으로 코드는 아래와 같고 런타임 에러 없이 통과하였다.
import sys
sys.setrecursionlimit(10**6)
n, m = map(int, sys.stdin.readline().split())
visited = [False] * (n+1)
arr = [[] for x in range(n+1)]
for _ in range(m):
start, end = map(int, sys.stdin.readline().split())
arr[start].append(end)
arr[end].append(start)
def dfs(current):
if visited[current] == True:
return
visited[current] = True
for i in arr[current]:
if not visited[i]:
dfs(i)
count = 0
for i in range(1, n+1):
if not visited[i]:
count += 1
dfs(i)
print(count)
'😵 알고리즘 공부' 카테고리의 다른 글
프로그래머스 달리기 경주 문제 시간 초과 (0) | 2023.04.28 |
---|---|
정렬 알고리즘 (버블, 선택, 삽입, 퀵, 병합, 기수) (0) | 2023.04.13 |
구간 합 (누적 합) (0) | 2023.04.12 |
DFS(깊이 우선 탐색)과 BFS(너비 우선 탐색) (0) | 2023.03.30 |
시간복잡도 (Python) (0) | 2023.03.26 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그