강의로 돌아가기

효율성 좋게 하려면 이 방법 써보세요.

우선, 무게 순서대로 사람을 줄 세웁니다.
맨 앞에 있는 사람이랑 맨 뒤에 있는 사람이랑 보트에 담을 수 있으면 같이 보냅니다.
같이 못 보내면 맨 앞의 사람만 보트에 태워서 보내버립니다.
이걸 반복하다가, 맨 앞의 사람이 보트 제한 무게의 절반 이하가 되면,
무조건 맨 뒤의 사람과 같이 보낼 수 있으므로 남은 사람은 남은 사람 수의 절반의 보트만 있으면 됩니다.

작성중인 코드―solution.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function solution(people, limit) {
    var answer = 0;

    const sortedPeople = people.sort((a, b) => b - a);

    var first = 0;
    var second = sortedPeople.length - 1;
    while (first <= second) {
        if (sortedPeople[first] <= limit / 2) {
            answer += Math.ceil((second + 1 - first) / 2);
            break;
        }

        answer++;
        switch (sortedPeople[first] + sortedPeople[second] <= limit) {
            case true:
                first++;
                second--;
                break;
            case false:
                first++;
                break;
        }
    }

    return answer;
}
  • 임연철

    한 수 배우고 갑니다

    임연철―2021.01.21 13:32
  • yy5326

    while문에 answer++ 를 빼놓은 이유는 ceil함수 때문에 빼놓은게 맞는건가요? 생존자가 1명 남았을때 ceil함수를 타면 0이 나오는거같아서요

    yy5326―2021.04.20 17:48
  • woohyeong

    배워갑니다.

    woohyeong―2021.07.19 18:28
  • STEADY

    많이 배우고 갑니다. 감사합니다.

    STEADY―2021.09.03 23:59
  • 이광우

    배워갑니다..

    이광우―2022.02.17 23:42
2 개의 답변

정렬 후 그냥 양 끝에 있는 사람끼리 묶어서 보내면 되는군요. 실제로 요소를 건드리지 않고 인덱스로 참조하는 것도 확실히 더 효율적이네요. 탈퇴하셔서 더 이상 못 보시겠지만 정말 고맙습니다!!

zooonique

몸무게가 가장 적은 사람과 합했을때, limit을 초과하면 그 사람은 무조건 혼자 보트를 타야한다........ 명쾌합니다..

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.