티스토리 뷰

😵 알고리즘 공부

백준 11724번 문제 파이썬 런타임 에러

2023. 5. 5. 19:33

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이 입력되기 때문에 개행문자를 제거해야 한다.

 

input()과 sys.stdin.readline()의 차이점 알아보기

 

 

 

최종적으로 코드는 아래와 같고 런타임 에러 없이 통과하였다.

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)

 

 

 

반응형
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그