네, 주어진 코드에서 인덱스 범위를 벗어나는 문제가 발생할 가능성이 있습니다. 주요 원인은 다음과 같습니다.
max_element 및 min_element 호출 후 인덱스 접근 문제cpp
복사편집
max = max_element(people.begin(), people.end()) - people.begin();
boat += people.at(max);
people.erase(people.begin() + max);
people.erase(people.begin() + max); 호출 후, people 벡터의 크기가 줄어듭니다.
하지만 min_element(people.begin(), people.end()) - people.begin(); 을 통해 얻은 min 인덱스를 다시 사용할 때, 벡터가 빈 경우 접근 문제가 발생할 수 있습니다.
즉, people이 비어 있을 때 min_element를 호출하면 people.begin()과 people.end()가 같아서, min_element가 people.end()를 반환하게 됩니다.
👉 빈 벡터에서 people.at(min)에 접근하면 out_of_range 오류 발생!
while(check >= people.at(min)) 루프 내에서 빈 벡터 접근 가능성cpp
복사편집
while (check >= people.at(min)) {
만약 people.erase(people.begin() + flag); 실행 후 people이 비어 있다면,
다음 people.at(min) 접근에서 벡터가 비어 있어 오류가 발생합니다.
people.empty() 체크 없이 min_element를 호출하여 min 값을 구하면, 빈 벡터에서 at() 접근이 발생하여 런타임 에러가 날 수 있습니다.
벡터가 비어 있는지 확인 후 min_element, max_element 호출하기
people.empty()를 먼저 체크하고 min_element나 max_element를 호출하면, 빈 벡터에서 잘못된 인덱스를 구하는 문제를 방지할 수 있습니다.
min_element 또는 max_element 호출 후 인덱스가 올바른지 확인
people.erase() 호출 후 벡터 크기가 변하므로, 그 이후에 다시 min_element를 호출할 때 크기를 체크해야 합니다.
while 루프 조건을 !people.empty()로 추가
people.at(min) 접근 전에 people.empty() 여부를 체크하면, 빈 벡터에서 인덱스를 참조하는 문제를 해결할 수 있습니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> people, int limit) {
int boat = 0; // 초기화 안 되어 있던 변수 초기화
int answer = 0;
int len = people.size();
int check = limit;
// 가벼운 순서로 정렬
sort(people.begin(), people.end());
// people이 빌 때까지 반복
while (!people.empty()) { // size() 체크보다 empty()가 더 안전함
// 탑승 가능한 사람 중 가장 무거운 사람부터 태우기
for (int i = people.size() - 1; i >= 0; i--) {
if (people[i] <= check) {
boat += people[i];
people.erase(people.begin() + i);
check = limit - boat;
}
}
// 남은 무게, 남은 사람 수 갱신
check = limit - boat;
len = people.size();
// 더 탈 수 있는 사람이 없어지면 보트 출발
if (!people.empty() && check < people[0]) {
boat = 0;
answer++;
check = limit;
}
// 남은 사람이 없으면 루프 종료
if (people.empty()) {
answer++; // 마지막 보트 출발
break;
}
}
return answer;
}
sort()를 사용해 정렬 후 투 포인터(two-pointer) 방식으로 문제 해결max_element, min_element 제거 → 벡터 인덱스 오류 방지