코딩테스트

[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반복이 종료된다.