3273. 런타임에러(OutOfBounds)
https://www.acmicpc.net/problem/3273
[풀이]
위 문제를 풀면서 런타임에러를 7번이나 받아서 왜 런타임에러가 발생했고 어떤 부분에서 주의하면 되는지 설명도 하면 좋을 것 같다.
런타임 에러는
1) 0으로 나눴을 때
2) 배열에 존재하지 않는 인덱스를 참조했을 때
2번의 경우에 배열의 크기를 초과한 인덱스를 참조하는 경우, 배열의 음의 인덱스를 참조하는 경우 두 가지가 있다. 나는 계속 배열의 크기를 초과한 인덱스를 참조한 경우만 고려했고 배열의 크기를 정확히 정의하거나 매우 크게 해도 런타임 에러가 사라지지 않았다. 내 코드에서 cnt[x-in[i]]와 같이 인덱스를 참조할 때 내부에 뺄셈이 있는 경우 이를 주의해야 한다.
#include <bits/stdc++.h>
using namespace std;
int in[100004];
int cnt[2000004];
int n,x,result;
int main(){
// 1. 입력받고 카운트
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i=0; i<n; i++) {
cin >> in[i];
cnt[in[i]] = 1;
}
cin >> x;
// 2. 쌍의 개수 세기
for (int i=0; i<n; i++){
if (x-in[i] <= 0) ;
else {
if (cnt[x-in[i]]) result++;
}
}
cout << result/2;
}
또한 초과된 인덱스를 참조하지 않기 위해서 충분히 큰 배열을 정의하거나 아니라면 최대 크기에서 조금 더 큰 배열을 만드는 것이 좋다.
'PS' 카테고리의 다른 글
BOJ - 2559. 수열 (C++) (0) | 2024.03.07 |
---|---|
BOJ - 9996. 한국이 그리울 땐 서버에 접속하지 (C++) (0) | 2024.03.07 |
BOJ - 10988. 팰린드롬인지 확인하기 (C++) (0) | 2024.03.01 |
BOJ - 10804. 카드 역배치 (C++) (0) | 2024.02.28 |
BOJ - 2309. 일곱 난쟁이 (C++) (0) | 2024.02.26 |