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

친환경 개발자
|2024. 4. 27. 22:12

[프로그래머스] 구명보트 (Lv.2)

https://school.programmers.co.kr/learn/courses/30/lessons/42885

 

 

문제

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


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

 

 

 

나의 답안(오답)

문제를 풀 때 최대 인원 제한이 2명이라는 것을 미처 생각지 못했다...

 

최대한 limit에 딱 맞게 태우면 최소한으로 배를 사용할 수 있겠다는 생각에

각 인덱스값에 limit을 나눠보기도 하고, 더했을 때 limit에 딱 맞는 사람 먼저 태워 보내는 것 등

여러 알고리즘을 생각해 봤지만 딱 맞는 알고리즘을 생각해내지 못했다.

 

그래서 오름차순으로 정렬 후 가벼운 사람들 먼저 태우자는 생각을 하여

코드를 작성했지만 답이 계속 틀렸고,

 

뒤늦게 인원제한이 있다는 것을 깨닫고 코드를 다시 짰다 ㅠㅠ

 

  1.  오름차순으로 정렬
  2. 무게 제한에서 해당 인덱스 무게를 빼가며 무게제한을 초과하지 않을 때까지 연산
  3. 무게제한 초과 시 count변수에 1을 더함
  4. 마지막 인원까지 태워 count+1을 return

 

 

<오답입니다>

import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        int count = 0;        
        int limitcheck = limit;
        
        Arrays.sort(people);
        
        for (int i=0; i<people.length; i++) {
            if (limitcheck - people[i] >= 0) {
                limitcheck -= people[i];
            } else if (limitcheck - people[i] < 0) {
                count++;
                limitcheck = limit;
                
                
        }
        
        return count+1;
    }
}

 

 

모범 답안

  1. 오름차순 정렬
  2. 좌우 동시 비교를 위한 인덱스 변수(i, j) 생성
  3. 가장 무거운 사람과 가벼운 사람의 합이 limit을 넘지 않으면 2명을 태우고(++i), 넘을 경우 무거운 사람만 태움
import java.util.Arrays;

class Solution {
    public int solution(int[] people, int limit) {
        Arrays.sort(people);

        int i = 0, j = people.length - 1;
        for (; i < j; --j) {
            if (people[i] + people[j] <= limit)
                ++i;
        }
        return people.length - i;
    }
}

 

  • 따로 count변수를 생성하지 않고 people.length-i로 값을 return한 것이 인상적이다.
    전부 1명씩만 태우면 people.length만큼 태웠을 것이고, 2명을 태웠다면 그 수만큼 i값을 올려 굳이 변수를 선언하지 않아도 결과값을 리턴할 수가 있는 것이다. 

 

 

 

복습

      for문의 예외형식

1. 초기값 생략 가능

int i=0;
for ( ; i<5; i++) {
    System.out.println(i);
}     // 출력: 0 1 2 3 4

 


2. 초기, 증감 생략 가능

int i=0;
for ( ; i<5; ) {
    System.out.println(i);
    i++;
}     // 출력: 0 1 2 3 4

 

 

3. 초기, 증감 여러 개 포함 가능

for (int i=0, j=0; i+j<6; i++, j+=2) {
    System.out.println(i+j);
}     // 출력: 0 3