문제
리뷰
이 문제의 핵심은 1명 또는 2명의 사람만 태울 수 있다는 것이다.
왜냐하면 제한사항이 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지기 때문이다.
맨 앞을 가리키는 인덱스 변수와 맨 뒤를 가리키는 인덱스 변수를 둔다.
그리고 people 벡터를 정렬 한다.
int front = 0; // 맨 앞 인덱스
int back = people.size() - 1; // 맨 뒤 인덱스
sort(people.begin(), people.end()); // 오름차순 정렬 [50, 50, 70, 80]
양 끝 인덱스의 사람 무게 합이 무게제한보다 작다면,
양 끝 인덱스를 증가 및 감소시킨다. (front 증가 , back 감소 )
// 인덱스 변화 : 앞에서는 증가, 뒤에서는 감소
if (people[front] + people[back] <= limit && (back-front >= 1) ) {
front++; back--;
// 2명을 태워 보낸 셈이니까 인덱스 차이가 (back-front >= 1) 만족해야 함.
}
else { // 뒤에 큰 값만 제거
back--;
}
코드
#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()); // 오름차순 정렬
while (front <= back) { // 양 끝 인덱스가 만날 때 까지
if (people[front] + people[back] <= limit && (back-front >= 1) ) {
front++; back--; // 인덱스 변화 : 앞에서는 증가, 뒤에서는 감소
}
else { // 뒤에 큰 값만 제거
back--;
}
answer++;
}
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 섬 연결하기 c++ (0) | 2022.04.01 |
---|---|
[프로그래머스] 신고 결과 받기 c++ (0) | 2022.03.05 |
[프로그래머스] 징검다리 건너기 c++ (0) | 2021.01.31 |
[프로그래머스] 실패율 c++ (0) | 2021.01.31 |
[프로그래머스] 체육복 c++ (0) | 2021.01.31 |