코딩테스트
[프로그래머스] 자바(Java) - 구명보트
수방방
2024. 6. 6. 23:17
🧩 문제
https://school.programmers.co.kr/learn/courses/30/lessons/42885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡내가 작성한 코드
⭐️ 제한된 무게를 가진 구명보트를 사용하여 최대한 많은 사람을 효율적으로 구축하는 것이 목적
- 최적의 선택을 하기 위해 최대한 무게가 무거운 사람과 가벼운 사람을 함께 태워야 함
import java.util.*;
class Solution {
public int solution(int[] people, int limit) {
int answer = 0;
int index = 0;
Arrays.sort(people);
for (int i = people.length - 1; i >= index; i--) {
if(people[i] + people[index] <= limit) {
answer++;
index++;
} else answer++;
}
return answer;
}
}
- `people[]` 배열을 오름차순으로 정렬
- 무게가 무거운 사람과 가벼운 사람을 쉽게 짝지을 수 있도록 정렬
- 무게가 가벼운 사람(`index`)과 가장 무거운 사람(`int i`)을 짝지을 수 있도록 변수 설정
- 무거운 사람을 기준으로 반복문을 실행하는 이유는 탐욕법의 원칙 중 하나인 "현재 상황에서 최적의 선택" 을 따라야 하기 때문에, 제한 무게에 가장 큰 영향을 미치는 무거운 사람을 기준으로 반복문 실행
- 무거운 사람을 기준으로 진행하면, 그와 함께 태울 수 있는 가벼운 사람을 찾아내기 용이
- 무거운 사람을 나중에 처리할 경우, 제한 무게를 초과하게 되어 불필요한 보트를 더 사용해야 될 경우가 생김
- 선택한 가벼운 사람과 무거운 사람이 `limit` 조건을 충족하는지 확인
- `limit`을 넘지 않을 경우, 두 사람을 태울 수 있는 조건을 충족시키는 것이기 때문에 `answer` 증가시키고, `index`를 증가시켜 다음 태울 사람의 인덱스를 지정
- `limit`을 넘을 경우, 보트를 보내야하기 때문에 `answer` 증가
- 모든 사람을 태울 때까지 반복 후, answer return
🧠 배운 점
이 문제를 풀면서 탐욕법이 무엇인지, 그리고 어떠한 상황에서 탐욕법을 사용하는 것이 적절한지 알게 되었다.
- 탐욕법의 정의와 최적의 선택을 위한 기준 설정
- 탐욕법은 매 순간마다 최적의 선택을 하여 문제를 해결하는 알고리즘
- 최적의 선택을 위해, 가장 무거운 사람을 기준으로 선택하여 최적의 값을 도출할 수 있었음