프로그래머스 LEVEL 2. 구명보트(JavaScript)

Bendeso·2023년 9월 6일
0
post-thumbnail

📌 문제 설명

❗ 제한 사항

🔎 입출력 예

✍ 문제 요약

구명보트의 무게 제한을 넘지 않는 조건에서 모든 사람을 구출하기 위해 필요한 구명보트의 개수의 최솟값을 구하라

  • 한 보트에는 2명까지만 태울 수 있다.
  • 한 사람의 최소 몸무게는 40kg이다

😭 틀린 코드

function solution(people, limit) {
    let answer = 0;
    
    people.sort((a, b) => b - a)  
    
    while(people.length > 0) {
        const rest = limit - people[0];
        people.splice(0, 1);
        if (rest >= 40) {
                for (let i = people.length-1; i >= 0; i--) {
                    if (rest >= people[i]) {
                        people.splice(i, 1);
                        break;
                    }
                }
        }

        answer += 1;
    }
    
    return answer;
}

처음에는 무게 제한에서 한 사람의 무게를 빼주고 남은 무게로 또 태울 수 있는 사람이 있는지 for문을 한 번 더 돌려서 찾는 방식으로 구현했다.

정답은 다 맞힐 수 있지만 남은 무게에서 또 태울 수 있는 사람이 있는지 검사할 때 people배열을 순회해주다보니 효율성 테스트에서 입구컷을 당해버렸다.
아마도 people배열의 최댓값이 50,000이다 보니깐 가뜩이나 큰 people배열을 너무 많이 순회하게 되어서 그런 것 같다.

😎 정답 코드

function solution(people, limit) {
    let answer = 0;
    
    people.sort((a, b) => b - a)  
    for (let i = 0; i < people.length; i++) {
        if (people[i] + people[people.length-1] <= limit) people.pop();
            
        answer += 1;
    }
    
    return answer;
}

그래서 수정한 코드에서는 people배열을 딱 한 번만 순회하도록 구현했다.
효율성 테스트까지 통과하는 것을 볼 수 있다.

🙌 마무리하며

어떻게 people배열을 한 번만 순회하면서 정답을 맞힐 수 있을까 고민을 조금 하긴했지만,
다행히 그렇게 오래 걸리는 문제는 아니었다.

profile
성장을 위한 몸부림

0개의 댓글