알고리즘_개념 및 문제풀이

프로그래머스/고득점문제키트/탐욕법(Greedy)/구명보트

swdream 2019. 5. 6. 15:06
반응형

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> people, int limit) {
    int answer = 0;
    sort(people.begin(), people.end());
    int light_idx = 0;
    int heavy_idx = people.size()-1;
    int double_cnt = 0;
    
    //light_idx 가 heavy_idx와 같아지는 순간은 나오도록 한다.
    //어차피 double_cnt 만 헤아리면 되기 때문이다.
    while (light_idx < heavy_idx){
        if(people[light_idx]+people[heavy_idx]<=limit){
            light_idx++;
            heavy_idx--;
            double_cnt++;
        }
        else{
            heavy_idx--;
        }
    }
    answer = people.size() - double_cnt;
    return answer;
}

https://programmers.co.kr/learn/courses/30/lessons/42885

 

알고리즘 연습 - 구명보트 | 프로그래머스

실행 결과가 여기에 표시됩니다.

programmers.co.kr

핵심 조건만 정리하면, 구명 보트 한 턴 당 max 2명 태울 수 있다는 점이다.

가장 효율적으로 태우기 위해서 이렇게 생각해볼 수 있다. 

가장 가벼운 사람 pick, 가장 무거운 사람 pick 한 후 둘의 합이 limit 내에 들어가는 경우(즉, 둘을 한 번에 태울 수 있는 경우),

둘을 태우고, 만약에 그렇지 않은 경우(이 둘의 합이 limit을 초과하는 경우), 가장 무거운 사람만 태운다. 

이를 코드로 구현하면 된다.

이를 구현하기 위해선 people 몸무게 벡터를 sort한 뒤, 아래와 같이 가벼운쪽 idx, 무거운 쪽 idx를 설정 후 좌우에서 서로 만날때까지 진행한다.

한가지 요령은 둘을 한 번에 태우는 경우에 대해서만 잘 count 한 뒤, 전체 인원수에서 둘을 한번에 태우는 경우의 수만 빼준다면 보트의 승선 횟수가 될 것이다. 

 

[구현 코드]


 

반응형