프로그래머스에서 그리디 알고리즘으로 분류되어 있는 문제였다.
인자로 받은 people 배열을 무게 오름차순으로 정렬하고 제일 무거운 사람(endIdx)과 제일 가벼운 사람(startIdx)의 무게의 합으로 두 명씩 구조하는게 제일 최적해라고 가정하고 풀이를 진행했다.
주요 로직은 아래와 같다.
문제 풀이 후 다른 사람의 로직을 확인해 보았는데 대부분 다 나와 비슷한 로직으로 풀이했다. 다만 내 풀이에서 중첩 조건문을 더 단순화해서 풀이할 수 있는데 이 부분이 조금 아쉽다..
Lifeboat.java
package com.example.Programmers.Lv2;
import java.util.Arrays;
/**
* 프로그래머스 Lv2 - 구명보트
* 그리디 알고리즘으로 풀이
* 오름차순 정렬하여 제일 무거운 사람과 제일 가벼운 사람의 무게의 합으로 두 명씩 구조하는게 제일 최적해라고 가정
*/
public class Lifeboat {
public int solution(int[] people, int limit) {
int answer = 0;
int startIdx = 0;
int endIdx = people.length - 1;
// 오름차순 정렬
Arrays.sort(people);
while (startIdx <= endIdx) {
// 제일 무거운 사람이 무게 제한을 넘을 경우
if (people[endIdx] >= limit) {
endIdx--;
} else {
int sum = people[startIdx] + people[endIdx];
// 제일 무거운 사람과 제일 가벼운 사람의 합이 무게 제한을 넘을 경우 제일 무거운 사람만 구조
if (sum > limit) {
endIdx--;
// 제일 무거운 사람과 제일 가벼운 사람의 합이 무게 제한을 넘지 않을 경우 두명 다 구조
} else {
endIdx--;
startIdx++;
}
}
answer++;
}
return answer;
}
}
LifeboatTest.java
package com.example.Programmers.Lv2;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
public class LifeboatTest {
@Test
public void testLifeboat() {
Lifeboat lb = new Lifeboat();
int[] people1 = { 70, 50, 80, 50 };
int result1 = lb.solution(people1, 100);
int[] people2 = { 70, 80, 50 };
int result2 = lb.solution(people2, 100);
assertEquals(3, result1);
assertEquals(3, result2);
}
}