본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 42885번: 구명보트 [Java]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        Arrays.sort(people);
        
        int left = 0;
        for(int i = people.length - 1; i >= left; i--) {
            if(people[i] + people[left] <= limit)
                left++;
            answer++;
        }
        return answer;
    }
}

2. 설명

int answer = 0;
Arrays.sort(people);

people을 오름차순으로 정렬합니다. 내림차순으로 정렬하면 더 편해지지만 오름차순으로 정렬해도 문제는 없습니다.

int left = 0;
for(int i = people.length - 1; i >= left; i--) {
    if(people[i] + people[left] <= limit)
        left++;
    answer++;
}

left는 가장 작은 무게를 가리키는 인덱스 값입니다. 반복문을 통해서 내림차순으로 정렬된 people을 뒤에서부터 진행하여 오름차순처럼 진행합니다. 가장 무거운 무게와 가장 작은 무게의 비교 후 limit를 넘지 않는다면 left를 증가시켜서 가장 작은 사람도 구명보트에 탑승한 것으로 처리합니다.

만약 limit를 넘는다면 가장 무거운 사람만 구명보트에 탑승하기에 answer만 증가시킵니다.

3. 정리

  1. 가장 무거운 사람과 가장 가벼운 사람의 합이 limit를 넘으면 가장 무거운 사람만 탑승
  2. 가장 무거운 사람과 가장 가벼운 사람의 합이 limit를 넘지 않으면 가장 가벼운 사람만 탑승
  3. 정렬을 이용해 쉽게 해결
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges