본문 바로가기

문제 풀이/Programmers

[프로그래머스] 구명보트 (JAVA)

문제 출처 - Programmers

문제는 여기

 

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

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

programmers.co.kr


[풀이]

1. 입력으로 주어지는 people을 정렬해준다.

2. 왼쪽과 오른쪽을 가리키는 포인터를 2개 만들어준다.

3. 가장 작은 사람과 가장 큰 사람의 합이 limit보다 작다면 가장 작은 사람이 보트에 탈 수 있으므로 left의 값을 증가시킨다.

4. 아니라면 큰 사람만 탈 수 있으므로 right를 감소시킨다.

5. 보트에 사람이 탔으므로 보트를 나타내는 answer를 증가시킨다.

6. 3. ~ 5. 의 과정을 left와 right가 같아질 때까지 반복한다.

7. 결과를 출력한다.

[접근]

1. 가장 조금 보트를 사용하는 방법이 무엇일까를 생각해보다가 가장 무거운 사람과 가장 가벼운 사람을 같이 태우는 것이라고 생각하였고 이 아이디어를 바탕으로 문제를 해결했다.

[코드]

import java.util.*;

class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        
        // people 오름차순 정렬
        Arrays.sort(people);
        
        // 왼쪽과 오른쪽
        int left = 0;
        int right = people.length - 1;
        
        // 서로 만날때까지 반복
        while (left <= right) {
            // 가장 작은 사람 + 가장 큰 사람이 제한보다 작으면
            if (people[left] + people[right] <= limit)
                // 작은사람이 탄 것으로 간주
                left++;
            // 큰사람은 항상 보트에 탐
            right--;
            // 보트 횟수 증가
            answer++;
        }
        
        return answer;
    }
}