프로그래머스 - 구명보트

KHW·2021년 3월 9일
0

알고리즘

목록 보기
13/37

문제 : 구명보트

90/100

기본적인 내용

최대 2명까지 탈수있는 구명보트보다 무게가 2명이 덜나가게 탈수있을 때 최소한의 구명보트 횟수

나의 코드

function solution(people, limit) {
    var answer = 0;
    let peopleCopy = people;
    people.sort((a,b)=>a-b);
    while(1){
        if(people[people.length-1] <= limit/2){
            return answer + Math.ceil(people.length/2);
        }
        if(people[people.length-1]+people[0] <= limit){
            people.splice(people.length-1,1);
            people.splice(0,1);
            answer++;
        }
        else{
            people.splice(people.length-1,1);
            answer++;
        }
        
        if(people.length==1){
            answer++;
            break;
        }
        if(people.length==0){
            break;
        }

    }
    
    return answer;
}

정렬 후 양끝의 합이 limit보다 작다면 둘다 없애고 answer증가, 그게 아니라면 큰 값만 삭제후 answer증가, 그걸 반복해서 어떤 값이 limit/2보다도 작다면 그보다 작은 남은 값들은 전부 limit보다 2명이 작기 때문에 남은값은 인원들/2로 계산한 값을 반올림해 더해준다.

효율성 5개중 2개 실패

다른사람 코드

function solution(people, limit) {
    people.sort(function(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;
}

j를 감소시키면서 해당 if문이 성립하면 i를 증가시키고 j와 서로 옆에 있을경우 끝이므로 해당까지 진행후 증가한 i(2명씩 탄 횟수) 만큼 전체에서 뺀 값을 리턴

느낀점

역시 코드를 보면 이해가 되는데 이것을 머리로 실행시키는데 문제가많다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글