728x90
알고리즘 문제를 풀다 보면 간혹 런타임 에러를 마주하게 된다!
런타임 에러는 프로그램 실행 중 발생한 오류이다.
프로그램 실행 중 잘못된 데이터를 가지게 되어 잘못된 처리를 진행하려 할 때 발생한다. 발생한 에러에 대해 프로그램 내에서 에러 처리를 하지 않은 경우에는 프로그램이 종료되기 때문에 치명적인 오류이다.
어떤 이유로 런타임 에러가 발생했는지 알려주는 경우도 있지만 원인을 알 수 없을 때가 많은데, 에러를 해결하려면 우선 원인을 알아야 한다. 아래 내용을 하나씩 잘 살펴보고 문제 원인을 찾아내자!
알고리즘 문제를 풀 때 Runtime Error가 발생하는 원인은 주로 다음과 같다.
물론 전부는 아니다.
(주 원인들은 boj/djm03178님의 글을 참고했습니다)
1. 배열에 할당된 크기를 넘어서 접근했을 때
- 배열의 크기가 5인데 [5]번 인덱스에 접근하려 했다던가
2. 전역 배열의 크기가 메모리 제한을 초과할 때
- 여기서 메모리는 보통 Data, Heap 영역
- Data 영역: 전역변수, 정적변수 등 저장
- Heap 영역: 동적으로 할당되는 영역. new, malloc 으로 선언하면 여기에 저장됨 (구조체나 클래스 등)
- 힙 영역에 할당된 메모리는 사용 후 해제를 해줘야 한다 free()
- 알고리즘 문제에 제시된 메모리 크기를 넘어갔을 가능성을 생각해 보자.
3. 지역 배열의 크기가 스택 크기 제한을 넘어갈 때
- 메모리 상의 Stack 영역
- Stack 영역: 지역변수, 매개변수, return address 등 저장. (함수 호출 여기에 저장)
- 알고리즘 문제를 풀 때 배열을 많이 선언하게 되는데 문제에 제시된 스택 크기를 넘어가지 않았는지 확인
- 스택 영역은 작게 메모리 영역은 크게 주어졌을 때 동적 할당으로 바꿔볼 수 있다.(단 시간은 손해볼 수 있다)
- 테스트케이스 중 일부는 통과하고 나서 런타임 에러가 발생하면 이 경우를 생각해 볼 수 있다.
- 만약 스택 제한이 1MB이고, int형(4Byte) 배열을 선언한다면 25만 개까지 가능하다.
- (실제로는 다른 것도 스택에 저장되어야 하니까 이보다 작아야 한다)
- 문제에서 N의 최대 크기를 잘 고려해 보자.
4. 0으로 나눌 때
5. 라이브러리에서 예외를 발생시켰을 때
6. 재귀 호출이 너무 깊어질 때
- 함수의 호출 -> Stack 영역에 저장된다.
7. 이미 해제된 메모리를 또 참조할 때
8. 프로그램(main함수)이 0이 아닌 수를 반환했을 때
- 0을 반환하는 것은 프로그램이 정상적으로 종료되었음을 뜻함(OS한테 알려주는 거).
- 반대로 0이 아닌 수는 문제가 발생했다는 뜻이므로 에러가 발생한다.
- main함수는 return 0; 해주거나 그냥 쓰지 말거나.
9. C/C++에서 반환형이 void가 아닌 main이 아닌 함수에서 아무런 값을 반환하지 않았을 때
'Algorithms' 카테고리의 다른 글
[BOJ 11068: 회문인 수] 수학 | C 언어 (1) | 2023.10.13 |
---|---|
[BOJ 9028: Iris] 구현, 문자열 | C언어 (3) | 2023.10.13 |
[Greedy Algorithm] 그리디 알고리즘 - 정당성 증명은 필수 (0) | 2023.07.15 |
[알고리즘] (0) | 2023.07.15 |