본문 바로가기

코딩테스트/프로그래머스

[Level 2][C++] 구명보트

#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;
}

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[Level 2][C++] 점프와 순간 이동  (0) 2024.10.01
[Level 2][C++] 영어 끝말잇기  (0) 2024.10.01
[Level 1][C++] N으로 표현  (0) 2024.10.01
[Level 1][C++] 체육복  (0) 2024.10.01
[Level 1][C++] 모의고사  (0) 2024.10.01