Programmers/Level 2
C++ / 프로그래머스 / 구명보트
GitHubSeob
2023. 7. 4. 02:19
| 문제 |
https://school.programmers.co.kr/learn/courses/30/lessons/42885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

| 문제풀이 |
최대 2명이란 점을 못 보고 풀다가 삽질했다..
lower_bound를 이용해서 풀어봤는데 효율성에서 시간초과가 나서 방법을 바꿨다.
투포인터 알고리즘을 사용해 풀었다.
오름차순이든 내림차순이든 상관은 없지만 오름차순으로 풀었다.
굳이 두 사람의 합을 limit에 가까이할 필요가 없다.
최대 2명이 탈 수 있고, 정렬을 했기 때문에 반례가 나올 수 없다.
가장 가벼운 사람과 가장 무거운 사람을 태운다.
만약에 태울 수 없으면 무거운 사람을 혼자 태운다.
가장 가벼운 사람을 태웠으면 ++left를, 가장 무거운 사람을 태웠으면 --right 해서
left가 right가 될 때까지 반복하면 된다.
| 코드 |
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> people, int limit) {
int answer(0), left(0), right(0);
sort(people.begin(), people.end());
right = people.size() - 1;
while (left <= right) {
if (left == right) {
++answer;
return answer;
}
else if (people[left] + people[right] <= limit) {
++left;
--right;
}
else if (people[left] + people[right] > limit) {
--right;
}
++answer;
}
return answer;
}