카테고리 없음

[Programmers]탐욕법 > 구명보트

수기 2022. 1. 23. 20:12

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

 

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

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

programmers.co.kr

 

문제를 푸는 방법 자체는 어렵지 않았다. 그런데 아무리 도전해도 계속 효율성에서 시간초과가 나서 ㅠㅠ 뭐가문제인지 모르겠어서 구글 검색을 했다.

현재 인원 중에서 제일 무거운 사람과, 제일 가벼운사람을 태울 수 있으면 같이 태우고,

태울 수 없으면 제일 무거운 사람만 혼자 태운다.

-> 제일 가벼운 사람을 못태우므로 나머지 사람들도 모두 함께 탈 수 없음

 

1.  people을 내림차순으로 정렬

2. front = 0부터 시작, end는 people의 마지막인덱스 people.size()-1 

3. 제일 큰 (제일 앞에 있는) people[front]를 boat안에 넣고, boat.back()의 값과 people[end]의 값이 limit이하이면 end--

4. front는 항상 ++

5. front보다 end가 더 작거나 같아질때까지 반복한다.

6. boat의 사이즈가 구명보트의 최솟값이다.

 

투 포인터 방식처럼 front, end 변수를 두고 보트안에 제일 무거운 사람을 태우면 front++, 제일 가벼운 사람도 태울 수 있으면 end--를 하면서 front <= end일때까지 반복한다.

 

 

 

 

 

main포함 코드(c++)


#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

vector<int> boat;
bool compare(int a,int b){
    return a>b;
}
int solution(vector<int> people, int limit) {
    int answer = 0;
    int front = 0;
    int end = people.size()-1;
    int cnt = 0;
    sort(people.begin(), people.end(), compare);
   
    while (front <= end) {

        boat.push_back(people[front]);
        if (people[front] + people[end] <= limit) {
            boat.back() += people[end];
            end--;
        }
        front++;
    }
    
    answer += boat.size();
    return answer;
}


int main() {

//    vector<int> people = {160, 150, 140, 60, 50, 40};
//    int limit = 200;
    
//    vector<int> people = {80,70,50,50};
//    int limit = 100;
    
//    vector<int> people = {80,70,50};
//    int limit = 100;
    
    vector<int> people = {40,50,60,90};
    int limit = 100;
    
    solution(people, limit);
}

 


시도한 테스트케이스

{160, 150, 140, 60, 50, 40} , 200 / 3

{80,70,50,50} , 100 / 3

{80,70,50}, 100 / 3

{40,50,60,90}, 100 / 3