728x90
url : https://www.acmicpc.net/problem/2109
런타임 에러 중 OutOfBounds 발생 이유
컨테이너 또는 배열에서 할당된 경계를 넘어가는 접근 발생 |
백준에서 위와 같이 설명하고 있지만 실제 코드를 제출했을때 어떤 부분에서 정확히 에러가 발생했는지 파악하기 어렵다.
#include <bits/stdc++.h>
using namespace std;
int n, d,p, ret;
vector<pair<int, int>> v;
priority_queue<int> pq;
int main(){
//1. 입력받기
cin >> n;
for(int i=0;i<n;i++){
cin >> p >> d;
v.push_back({d, p});
}
//2. 내림차순 정렬
sort(v.begin(), v.end(), greater<>());
//3. 우선순위 큐에 집어넣기
int ptr=0;
for(int i=v[0].first;i>=1;i--){ // 날짜 큰 순 -> 작은 순
while(ptr<n && v[ptr].first>=i) pq.push(v[ptr++].second);
if(pq.size()){
ret += pq.top(); pq.pop();
}
}
cout << ret;
}
위 코드에서 런타임 에러가 발생한 지점은?
바로 v[0].first 지점이다.
n이 1 이상이어서 벡터에 값이 잘 들어갔다면 의도한대로 작동했겠지만,
n이 0인 경우 값이 초기화되어있지않아 v[0].first에서 OutOfBounds 에러가 발생한다.
해결책
1. 벡터를 기본값(0)으로 초기화한다.
vector<pair<int, int>>(10004, make_pair(0,0));
2. 벡터 요소 접근 전 크기를 확인한다.
if (v.size()) { for(int i=v[0].first~~~)
참고
리스트의 경우에는 전역 변수로 선언시 0으로 값이 자동할당된다.
지역변수일 경우 쓰레기값이 들어가는데, 예상치 않은 행동이 일어날 수 있으므로 비추천이다.
728x90
'알고리즘 > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 2467:용액 (0) | 2023.11.28 |
---|---|
[백준] 14503: 로봇 청소기 (2) | 2023.11.27 |
[프로그래머스] 바탕화면 정리 (0) | 2023.11.27 |
[PCCE 기출문제] 10번 / 데이터 분석 (0) | 2023.11.26 |
[백준] 17070 : 파이프 옮기기 (0) | 2023.09.02 |