탐욕 알고리즘을 적용하여 풀 수 있는 문제입니다.
https://programmers.co.kr/learn/courses/30/lessons/42885
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
탐욕 알고리즘에 대한 자세한 내용은 아래의 블로그에서 확인하실 수 있습니다.
[알고리즘] 탐욕 알고리즘(Greedy Algorithm) - 하나몬
❗️탐욕 알고리즘(Greedy Algorithm)이란? Greedy는 ‘탐욕스러운, 욕심 많은’ 이란 뜻이다. 탐욕 알고리즘은 말 그대로 선택의 순간마다 당장 눈앞에 보이는 최적의 상황만을 쫓아 최종적인 해답에
hanamon.kr
탐욕 알고리즘에 핵심은 현재 상황에서 가장 최선의 선택을 하는 것인데
일반적으로 for loop를 한번 돌 때 마다 결과를 하나씩 찾아 나갈 수 있도록 문제를 해결해야 하는 것입니다.
이번 문제는 모든 사람을 구출하기 위한 구명보트의 최솟값을 구하는 문제입니다.
단 한개의 구명보트에 탈 수 있는 사람의 수는 2명이라는 점과, 구명보트가 견딜 수 있는 사람의 무게가 정해져 있다는 것입니다.
문제를 풀기위해 사람의 몸무게를 기준으로 sort를 하였습니다.
몸무게가 가장 가벼운 사람과 가장 무거운 사람을 한명씩 데리고 나와 구명보트에 탈 수 있는 무게인지 확인합니다.
무거워서 두명이 같이 탈 수 없다면 그것은 무거운 사람의 문제입니다.
가벼운 사람은 대기 무거운 사람은 구명보트에 태워서 보내버립니다.
다음 무거운 사람을 데리고 나와 가벼운 사람과 비교하고 둘이 같이 탈 수 있는 무게이면 같이 태워서 보내버립니다.
-- 반복 --
코드로 아래와 같이 구현을 하였습니다.
import java.util.Arrays;
class Solution {
public int solution(int[] people, int limit) {
Arrays.sort(people);
int frontIndex = 0;
int endIndex = people.length - 1;
int answer = 0;
while (true) {
if (frontIndex > endIndex) {
break;
}
if (frontIndex == endIndex) {
answer ++;
break;
}
answer ++;
if (people[frontIndex] + people[endIndex] > limit) {
endIndex --;
continue;
}
frontIndex ++;
endIndex --;
}
return answer;
}
}
위와 같이 복잡했던 코드를 아래와 같이 더 간결하게 작성을 할 수 있습니다.
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;
}
}