#include <string>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
int solution(vector<int> people, int limit) {
//우선 사람들을 무게로 내림차순으로 정렬한다. 큰->작은
sort(people.begin(), people.end(), greater<int>());
//전체 사람 수에서 반을 나누고. 그 중 제일 작은 사람의 무게를 저장한다.
//왜냐하면 다른 사람에게 더해졌을 경우 0으로 만들 것이기 때문에.
int minM = people[people.size()/2];
//딱 반만큼. 크기가 큰 사람들끼리 Limit을 넘지 않는 범위에서 합친다.
for (int i = 0; i <= people.size() / 2; i++)
{
//다른 사람에게 이미 더해졌으면(0이면) 패스, 이미 더해진 총합이 limit이어도 패스.
if (people[i]==0 || people[i] == limit)
continue;
for (int j = i+1; j <= people.size() / 2 ; j++)
{
//최소가 들어갈 공간조차 없다면 반복문을 벗어난다.
if(people[i]+minM>limit)
break;
if (people[j]==0)
continue;
if (people[i] + people[j] <= limit) //더해질 수 있다면 더하고, 더해진 사람의 무게를 0으로 만든다.
{
people[i] += people[j];
people[j] = 0;
}
}
}
//반복문 전체를 돌리면서, 답도 같이 얻는다. 사람 무게가 0으로 변하지 않았다면, 구명보트라는 얘기.
int answer = 0;
int min = people.size()-1; //맨 뒤 사람의 순서를 저장해둔다.
for (int i = 0; i < people.size(); i++)
{
if (people[i]==0)
continue;
answer++; //0이 아니면 구명보트로 카운트.
if( people[i] == limit)
continue;
//맨 앞에 있는 애에다 맨 뒤에서부터 들어갈 수 있는 지 확인한다.
for (int j =min; j>i; j--)
{
if(people[i]+people[j]>limit)
{
//limit을 넘겼다면 j뒤 쪽에 있는 숫자들은 다 썼다는 거다. 맨 뒤부터 반복문 돌 필요 없게 min을 j로 바꿔준다.
min = j;
break;
}
else
{
people[i] += people[j];
people[j] = 0;
}
}
}
return answer;
}