알고리즘/BOJ

알고리즘을 풀 때 런타임 에러가 발생하는 이유

꾸준함. 2020. 11. 5. 00:36

알고리즘을 풀다 보면 런타임 에러가 종종 발생합니다.

테스트 케이스에서 런타임 에러가 발생할 경우 어디서 발생하는지 로그를 찍어보며 확인할 수 있지만 시스템 케이스에서 발생한다면 어디서 발생하는지 알 수가 없기 때문에 상당히 답답합니다.

따라서, 이번에는 djm03178님께서 정리해주신 런타임 에러가 발생하는 대표적인 이유 9가지를 알아보겠습니다.

 

1. 배열에 할당된 크기를 넘어 접근하는 경우

int arr[N];

예를 들자면 위와 같이 크기가 N인 int형 배열을 선언하였고 반복문을 돌리는데 arr[N]을 접근할 경우 런타임 에러가 발생합니다.

접근할 수 있는 범위는 [0..N)

 

2. 전역 배열의 크기가 메모리 제한을 초과하는 경우

위 같은 경우는 문제마다 주어진 메모리가 다르기 때문에 유의하셔야 합니다.

(제 경험상 visual studio 같은 경우 int형 배열의 크기가 10,000,000을 넘어가면 정상적으로 실행이 안 되는 것 같습니다.) 

 

3. 지역 배열의 크기가 스택 크기 제한을 넘어가는 경우

 

4. 0으로 나눌 때

저 같은 경우 전역 변수의 값을 정의하지 않아 런타임 에러가 종종 발생했습니다.

 

5. 라이브러리에서 예외를 발생시켰을 경우

 

6. 재귀 호출이 너무 깊어질 경우

3번과 비슷한 케이스인데 재귀 호출의 횟수가 스택 크기 제한을 넘어가는 경우 런타임 에러가 발생합니다.

 

7. 이미 해제된 메모리를 또 참조할 경우

c++로 알고리즘을 풀 때 동적 할당을 거의 사용하지 않기 때문에 위와 같은 문제는 거의 발생하지 않을 것 같습니다.

 

8. 프로그램이 0이 아닌 수를 반환할 경우

main문에서 return 0;을 해주시거나 아무것도 return 안 하셔야 런타임 에러를 방지할 수 있습니다.

또한, main문에서 호출한 함수에서 값을 출력하고 프로그램을 종료하고 싶으시다면 exit(0); 코드를 작성해주시면 됩니다.

예를 들자면 return -1; 혹은 exit(-1); 같은 코드를 추가한다면 런타임 에러가 발생합니다.

 

9. C/C++에서 반환형이 void가 아닌 main이 아닌 함수에서 아무런 값을 반환하지 않을 경우

제가 백준 2146번 다리 만들기 문제를 풀었을 때 위와 같은 경우 때문에 런타임 에러가 발생했었습니다.

소스의 BFS 함수를 참고해주세요!

 

런타임 에러가 발생한 소스: boj.kr/f6bbd7d2ab0b43ac8904464cf656e6ca

AC를 받은 소스: boj.kr/2055b22cbce0461183e578ca8ea04ba2

 

 

[출처]

www.acmicpc.net/board/view/22980

 

글 읽기 - 주로 런타임 에러가 발생하는 이유는 무엇인가요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

반응형

'알고리즘 > BOJ' 카테고리의 다른 글

백준 2056번 작업  (0) 2020.12.12
백준 11657번 타임머신  (0) 2020.12.10
백준 10837번 동전 게임  (0) 2020.09.03
백준 11378번 열혈강호 4  (0) 2020.08.27
백준 11377번 열혈강호 3  (0) 2020.08.24