프로그래머스 연습문제 - 구명보트 (level2, JS)

j_wisdom_h·2023년 2월 5일
0

CodingTest

목록 보기
34/58

프로그래머스 연습문제 - 구명보트 (level2)

문제설명


입출력예 & 제한사항


Solution

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;
}
profile
뚜잇뚜잇 FE개발자

0개의 댓글