티스토리 뷰

programmers.co.kr/learn/courses/30/lessons/42885

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

 

문제는 위와 같으며 문제 조건 중 배에는 최대 2명만 탈 수 있다는 것을 기억해야 합니다. 따라서 무게가 많이 나가는 사람을 먼저 태운 뒤, 무게가 덜 나가는 사람을 같이 태울 수 있는지 없는지 판단하는 방식으로 문제를 해결하였습니다.

 

예를 들어 [70, 50, 80, 50, 20], limit = 100 이 주어진 경우

1. 사람들을 무게순으로 먼저 정렬합니다.

2. 이후 제일 무게가 많이 나가는 사람과 제일 무게가 적게 나가는 사람을 동시에 태우는 것이 가능하다면 둘을 태우고

3. 그렇지 않다면 무게가 많이 나가는 사람만 보트에 태우고 보트 수를 증가시킵니다. (2, 3 과정을 반복)

4. 최종적으로 젤 무게가 나가지 않는 사람까지 보트에 모두 오르면 반복을 종료하고 보트 수를 반환합니다.

 

 

코드는 다음과 같습니다.

 

import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;

        // 무게순으로 정렬하기 (오름차순)
        Arrays.sort(people);

        int head = 0;                  // 처음 사람을 가리키는 인덱스
        int tail = people.length - 1;  // 마지막 사람을 가리키는 인덱스

        // 처음 사람과 마지막 사람이 같아질 때까지 반복
        while (head <= tail) {
            int first = people[head];
            int last = people[tail];

            // 처음 사람의 무게와 마지막 사람의 무게의 합이 제한보다 작거나 같은 경우
            if (first + last <= limit) {
                head++;  // 처음 사람도 배에 태울 수 있으므로 처음 사람 인덱스를 다음으로 이동
            }

            // 마지막 사람의 경우 처음 사람과의 무게의 합이 제한보다 큰지 작은지에 상관없이 항상 배에 먼저 태움
            // 따라서 마지막 사람 인덱스는 항상 하나 감소
            tail--;
            answer++;  // 처음 사람 + 마지막 사람 또는 마지막 사람만 태운채로 보트 수 증가
        }

        return answer;
    }
}

'알고리즘' 카테고리의 다른 글

[백준알고리즘] 15649 - N과 M (1)  (0) 2021.04.29
[프로그래머스] 카펫  (0) 2021.04.23
[프로그래머스] H-Index  (0) 2021.04.21
[프로그래머스] 큰 수 만들기  (0) 2021.04.11
[프로그래머스] 가장 큰 수  (0) 2021.04.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 28 29 30 31
글 보관함