코딩테스트
[JS] 탐욕법(Greedy) > 구명보트
차차한
2022. 9. 14. 15:28
구명보트는 작아서 한 번에 최대 2명씩밖에 탈 수 없다
문제 꼼꼼하게 잘 읽자...
function solution(people, limit) {
var answer = 0;
people = people.sort((a,b)=>a-b);
while (people.length) {
let weight = people.pop();
if (weight + people[0] <= limit) {
people.shift();
}
answer++;
}
return answer;
}
people을 오름차순으로 정렬을 해주고
가장 가벼운 사람, 가장 무거운 사람을 더해 limit과 비교한다.
people이 [70,50,80,50]일 때 정렬을 하면 [50,50,70,80]이 된다.
weight 변수에는 마지막 값인 80이 담기고 people 배열은 [50,50,70]이 된다.
weight과 people[0](=50)을 더하면 limit 100이 넘기 때문에 shift를 하지 않고 카운트를 올린다.
(카운트 올림 = weight에 담긴 사람만 보트 하나를 탈 수 있다는 뜻)
다시 반복을 해서
weight에 70을 담고 people 배열은 [50,50]이 된다.
weight + people[0](=50) 더하면 이번에도 limit이 넘어서 shift하지 않고 카운트를 올린다.
weight에 50을 담고 people 배열은 [50]이 된다.
weight + people[0]을 하면 limit이 딱 맞게 되어 people.shift()를 해서 people을 비워준다.
while조건이 people에 값이 있을 때여서 people에 이제 아무 값이 없으면 while반복이 종료된다.