프로그래머스 연습문제 - 구명보트 (level2)
function solution(people, limit) {
let answer = 0;
people.sort((a,b) => a - b)
while (people.length > 1) {
if (people[0] + people[people.length - 1] <= limit) {
people.shift();
people.pop();
} else {
people.pop();
}
answer++;
}
return people.length === 0 ? answer : answer + 1;
}
제한사항을 잘 읽자.. 최대 2명까지 탈 수 있다는 것을 못보고 헛발질을 했다. 그래서 아래처럼 최소 구명보트 수를 구했다.
function solution(people,limit){
let sum = people.reduce((acc,cur) => {
if(limit / 2 < cur) { answer++; return acc;}
if(limit< acc + cur ) { answer++; return cur}
else if (limit > acc + cur) { return acc + cur;}
else {
answer++;
return acc = 0;
}
},0);
console.log(sum === 0 ? answer : answer + 1);
}
아무리해도 30점밖에 안나와서 문제를 정독을 하고 이마를 탁하고 쳤다.
그 다음 헛발질1. 왜 이렇게 생각을 했을까? 바보인가..
최소값과 최댓값을 엮어서 계산하지 않고, 무조건 limit의 절반이 넘으면 보트수를 증가해줬다.
function solution(people, limit) {
let answer = 0;
let boat = people.filter( (person) => {
if( limit/2 < person ) answer++;
else return person
});
if(boat.length % 2 === 0 && boat.length > 0){
answer += boat.length / 2;
}
else if(boat.length % 2 !== 0) {
answer += parseInt(boat.length / 2) + 1 ;
}
}
그 다음 헛발질2
function solution(people, limit) {
let answer = 0;
people.sort() // 여기가 문제
while (people.length > 1) {
if (people[0] + people[people.length - 1] <= limit) {
people.shift();
people.pop();
} else {
people.pop();
}
answer++;
}
return people.length === 0 ? answer : answer + 1;
}
마의 35점 구간에 걸렸다.
sort()가 문제!
sort()는 유니코드를 기준으로 정렬되기 때문에 숫자 오름/내림차순 정렬을 정확하게 쓸려면 .sort((a,b) => return a-b), .sort((a,b) => return b-a) 이렇게 써야한다.
배열을 계속해서 가공하는 것이 효율성을 떨어뜨릴 것 같아서 찾아본 다른 솔루션!
function solution(people, limit) {
people.sort((a, b) => return a-b);
for(var i=0, j=people.length-1; i < j; j--) {
if( people[i] + people[j] <= limit ) i++;
}
return people.length-i;
}