-
[프로그래머스/JAVA] 구명보트Algorithm 2024. 10. 16. 15:31
- 문제 풀이
1.몸무게 배열 정렬
import java.util.*; class Solution { public int solution(int[] people, int limit) { int answer = 0; // [50, 50, 70, 80] // [50, 70, 80] Arrays.sort(people);
2. 가장 무거운 사람부터 순회하면서 보트에 태울 수 있는 사람들을 짝지어 태운다.
int index = 0; // 가장 가벼운 사람의 인덱스 // 무거운 사람 -> 가벼운 사람 순으로 순회 for(int i = people.length - 1; i >= index; i--) {
- 배열의 끝에서부터 시작하여, 가장 무거운 사람부터 순회합니다. i는 가장 무거운 사람의 인덱스를 가리킵니다.
- index가 i보다 작거나 같을 때까지 반복합니다. 이 조건이 만족하지 않으면 모든 사람을 다 태운 것입니다.
3. 가장 가벼운 사람과 가장 무거운 사람을 함께 태울 수 있는지 확인한다.
for(int i = people.length - 1; i >= index; i--) { // 가장 가벼운 사람 + 가장 무거운 사람이 limit 보다 작거나 같으면 두사람 묶어서 보트 한개에 태우기 if(people[index] + people[i] <= limit) { answer++; index++; }else{ answer++; } }
- people[index] + people[i] <= limit인 경우, 가장 가벼운 사람과 가장 무거운 사람의 무게 합이 보트의 제한 limit을 넘지 않는다는 뜻입니다. 이 경우 두 사람을 함께 보트에 태울 수 있습니다.
- 두 사람을 함께 태웠다면, index++를 통해 가장 가벼운 사람의 인덱스를 다음으로 이동시킵니다.
- 만약 두 사람의 무게 합이 limit을 초과하면, 가장 무거운 사람만 보트에 태웁니다. 이 경우 index를 증가시키지 않고 answer++만 수행합니다.
예시 실행
사람들의 몸무게가 [70, 50, 80, 50]이고, 보트의 제한이 100인 경우를 생각해봅시다.
- 정렬 후 배열: [50, 50, 70, 80]
- i = 3 (80kg), index = 0 (50kg)
- 50 + 80 > 100이므로, 80kg 한 명만 보트에 태움 (answer = 1)
- i = 2 (70kg), index = 0 (50kg)
- 50 + 70 ≤ 100이므로, 50kg과 70kg을 함께 보트에 태움 (answer = 2, index = 1)
- i = 1 (50kg), index = 1 (50kg)
- 50 + 50 ≤ 100이므로, 50kg 두 명을 함께 보트에 태움 (answer = 3, index = 2)
결과적으로, 필요한 최소 보트의 수는 3개입니다.
- 정답 코드
// https://school.programmers.co.kr/learn/courses/30/lessons/42885 package Lv2.구명보트; import java.util.*; // 정렬 후 // 가장 몸무게가 많이 나가는 사람과 가장 몸무게가 적게 나가는 사람들끼리 보트에 태워 보내기 class Solution { public int solution(int[] people, int limit) { int answer = 0; // [50, 50, 70, 80] // [50, 70, 80] Arrays.sort(people); int index = 0; // 가장 가벼운 사람의 인덱스 // 무거운 사람 -> 가벼운 사람 순으로 순회 for(int i = people.length - 1; i >= index; i--) { // 가장 가벼운 사람 + 가장 무거운 사람이 limit 보다 작거나 같으면 두사람 묶어서 보트 한개에 태우기 if(people[index] + people[i] <= limit) { answer++; index++; }else{ answer++; } } return answer; } }
'Algorithm' 카테고리의 다른 글
[백준/JAVA] 후위 표기식2 (0) 2024.10.17 [프로그래머스/JAVA] 큰 수 만들기 (0) 2024.10.16 [프로그래머스/JAVA] 체육복 (0) 2024.10.15 [프로그래머스/JAVA] 여행경로 (0) 2024.10.14 [프로그래머스/JAVA] 단어 변환 (0) 2024.10.06