구명보트의 무게 제한을 넘지 않는 조건에서 모든 사람을 구출하기 위해 필요한 구명보트의 개수의 최솟값을 구하라
- 한 보트에는 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배열을 한 번만 순회하면서 정답을 맞힐 수 있을까 고민을 조금 하긴했지만,
다행히 그렇게 오래 걸리는 문제는 아니었다.