ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 구명보트 Java 풀이
    문제풀이/프로그래머스 2021. 11. 16. 14:22
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


    1. 문제

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

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

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

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

    2. 입력

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

    3. 예제

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

    4. 풀이

    입력으로 주어진 사람들의 몸무게를 오름차순으로 정렬을 하여 가장 가벼운 사람이 앞에오고 가장 무거운 사람이 마지막에 오도록 합니다.

     

    구명보트는 한번에 최대 2명만 탑승이 가능 하므로 탑승을 하고자 하는 사람을 선택 할때 가장 앞사람(가장 가벼운 사람)과 맨 뒤에 사람(가장 무거운 사람)을 선택 한 뒤 무게 제한을 넘는지 확인 합니다.

     

    여기서 2가지 경우의 수가 생기게 됩니다.

    • 제한 무게를 넘는 경우
    • 제한 무게를 넘지 않는 경우

    제한 무게를 넘는 경우

    가장 가벼운 사람과 가장 무거운 사람의 합이 제한을 넘는 다는 것은 가장 무거운 사람은 어떠한 사람과 함께 보트를 타더라도 제한 무게를 넘는다는 것 입니다. 그러므로 가장 무거운 사람은 혼자 보트를 타야하는 경우가 됩니다.

     

    제한 무게를 넘지 않는 경우

    두 사람이 같이 보트를 탈 수 있는 경우이므로 한번에 두 사람을 태워 나가면 됩니다.

     

    Arrays.sort(people);

    위 코드처럼 입력으로 주어진 사람 몸무게를 오름차순으로 정렬 합니다.

     

    Deque<Integer> deque = new LinkedList<>();
    for (int person : people) deque.offerLast(person);

    위 코드처럼 Deque에 정렬된 사람들을 하나씩 뒤에 입력하여 정렬된 Deque를 구성합니다. Deque를 이용한 이유는 정렬된 정수 값을 맨 앞과 맨 뒤에서 가지고 와야 하므로 Deque를 이용하였습니다.

     

    int answer = 0;
    while(deque.size() > 1){
    	int front = deque.pollFirst();
    	int back = deque.pollLast();
    
    	if(front + back > limit)
    		deque.offerFirst(front);
    
    	answer++;
    }

    이제 큐에 정수값이 1개 이상인 경우 맨 앞 정수와 맨뒤 정수를 가져와 두 값의 합이 제한 무게를 넘는지 확인 후 넘은 경우 맨앞 정수값을 다시 큐의 맨 앞에 추가 합니다. 즉 몸무게가 가장 무거운 사람 혼자 배를 타고 나가는 경우로 만들어 주는 것 입니다.

     

    if(!deque.isEmpty())
    	answer++;

    마지막으로 큐가 Empty가 아닌경우는 한명의 사람이 남아 있는 것으로 정답 수를 1증가 시킵니다.

     

    이후 정답을 반환하여 문제를 풀었습니다.

    5. 코드

    전체 코드는 Git에 있습니다.

    Arrays.sort(people);
    
    Deque<Integer> deque = new LinkedList<>();
    for (int person : people) deque.offerLast(person);
    
    int answer = 0;
    while(deque.size() > 1){
    	int front = deque.pollFirst();
    	int back = deque.pollLast();
    
    	if(front + back > limit)
    		deque.offerFirst(front);
    
    	answer++;
    }
    
    if(!deque.isEmpty())
    	answer++;
    
    return answer;
    반응형

    댓글

Designed by Tistory.