본문 바로가기
알고리즘(프로그래머스)

프로그래머스 구명보트(자바)

by coie 2021. 4. 24.

문제 설명

 

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

예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 50kg]이고 구명보트의 무게 제한이 100kg이라면 2번째 사람과 4번째 사람은 같이 탈 수 있지만 1번째 사람과 3번째 사람의 무게의 합은 150kg이므로 구명보트의 무게 제한을 초과하여 같이 탈 수 없습니다.

구명보트를 최대한 적게 사용하여 모든 사람을 구출하려고 합니다.

사람들의 몸무게를 담은 배열 people과 구명보트의 무게 제한 limit가 매개변수로 주어질 때, 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

 

제한사항

  • 무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.
  • 각 사람의 몸무게는 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.
  • 구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

입출력 예

 

people limit return
[70, 50, 80, 50] 100 3
[70, 80, 50] 100 3

문제 해석

 

일단 탐욕 법이라고 해서 가장 최적의 답안을 내놓는 문제인데

구명보트에는 최대 2명이 탈 수 있고

limit의 무게를 넘어갈 수가 없다.

이 중에서 제일 적은 수를 내야 한다

라는 점에서 먼저 배열을 정렬해야겠다고 생각했습니다.

그리고 반복문으로 배열 2개의 값을 비교.

까지 생각 한 후명 보트 개수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

 

 

 

 

 

제한사항

 

무인도에 갇힌 사람은 1명 이상 50,000명 이하입니다.

각 사람의 몸무게는 40kg 이상 240kg 이하입니다.

구명보트의 무게 제한은 40kg 이상 240kg 이하입니다.

구명보트의 무게 제한은 항상 사람들의 몸무게 중 최댓값보다 크게 주어지므로 사람들을 구출할 수 없는 경우는 없습니다.

 

입출력 예

people 

limit  return
[70, 50, 80, 50] 100 3
[70, 80, 50] 100 3

 

 

 

문제 해석

 

 

 

일단 탐욕법이라고 해서 가장 최적의 답안을 내놓는 문제인데

 

구명보트에는 최대 2명이 탈 수 있고

 

limit의 무게를 넘어갈 수가 없다.

 

이 중에서 제일 적은 수를 내야 한다

 

라는 점에서 먼저 배열을 정렬해야겠다고 생각했습니다.

 

그리고 반복문으로 배열 2개의 값을 비교.

 

까지 생각한 후

 

 

import java.util.*;

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

        Arrays.sort(people);

        int min = 0;

        for(int i=people.length-1;min<=i;i--){
            if(people[min]+people[i] <= limit){

                min++;
            }
            answer++;
        }

        return answer;
    }
}

min은 people [0]부터 시작하고

max는 people [people.length-1]부터 시작해서

양끝의 두 숫자를 비교해 줍니다.

처음에는 바보같이 limit가 아니라 100을 적어서 전부 틀렸다고 나왔는데

꼭 변수명으로 적어야 한다.

 

탐욕 법은 처음 풀어보는데 

이게 맞나... 싶기도 하다