본문으로 바로가기

[프로그래머스](Greedy) 구명보트 (C++)

category Algorithms/Greedy 2021. 7. 16. 10:01

구명보트(Level 2)

문제

전체 문제 보기

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

접근법

문제에서 요구한 구명보트 개수의 최솟값을 구하기 위해서는 제한 무게를 넘지 않는다면, 가장 무거운 사람이 가장 가벼운 사람과 탑승해야 한다. 다음과 같은 상황을 생각해보자

보트의 무게 제한: 150kg
사람들의 무게: 100kg 80gk 60kg 50kg

가장 무거운 사람인 100kg인 사람이 가장 가벼운 50kg과 같이 탑승해야 보트를 가장 효율적으로 사용할 수 있다. 만약 80kg인 사람이 50kg인 사람과 탑승하게 되면, 100kg인 사람은 60kg인 사람과 함께 탑승할 수 없기 때문에 보트를 한번 더 운영해야 한다. 때문에 이번 문제는 "가장 무거운 사람이 가장 가벼운 사람과 탑승한다."라는 부분적인 최적의 해가 전체적인 최적의 해가 될 수 있는 그리디로 풀 수 있는 문제이다.

구현

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

using namespace std;

int solution(vector<int> people, int limit) {
    int answer = 0;
    // 사람들의 무게는 무작위로 들어오기 때문에 정렬하여 사용한다.
    sort(people.begin(), people.end(), greater<int>());

    // i: 가장 무거운 사람부터 탐색, 보트에 탑승시 ++
    // j: 가장 가벼운 사람부터 탐색, 보트에 탑승시 --
    for(int i = 0, j = people.size() - 1; i <= j; i++)
    {
        // 가장 무거운 사람과 가벼운사람의 무게합이
        // 보트의 제한보다 작다면, 가벼운사람도 함께 탑승
        if(people[i] + people[j] <= limit)
            j--;

        // 루프문을 돌 때 마다 보트 이용량++
        answer++;
    }
    return answer;
}