관리 메뉴

기억을 위한 기록들

[프로그래머스 lv 2 ] - 구명보트 (C++) 본문

Coding Test - cpp/Greedy

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

에드윈H 2023. 11. 22. 14:44

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이 : 우선 오름차이 정렬을 한뒤 좀 헤매긴했다 순차적으로 i +( i+1 ) 식으로 처음에 계산했다가 왜 안되는지 반례를 찾아 본뒤에야 해결 했다.

 

 

예를 들어,

people = [10, 20, 30, 40, 50, 60, 70, 80, 90]
limit = 100

이 같은 경우 처음에 생각 했던 방식으로는 10,20 / 30,40 / 50 / 60 / 70 / 80 / 90 으로하면 답이 7이 나오는데 제일 큰수와 제일 작은수를 더하는 식으로 하면 10,90 / 20,80 / 30,70 / 40,60 / 50으로 되어 5 라는 값이 나와서 7보다 더 효율적으로 탑승 해줄 수가 있다.

 

 

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

using namespace std;

int solution(vector<int> people, int limit) {
    int answer = 0;
    int front = 0;    
    int back = people.size()-1;      

    sort(people.begin(),people.end());
    
    int i=0;
    
    while(front <= back)
    {
        if(people[front] + people[back] <= limit)
        {
            front++;
            back--;
        }else
        {
            back--;
        }
        
        answer++;
    }

    return answer;
}