하루에 한 문제

[프로그래머스] 구명보트 -Java 본문

알고리즘/프로그래머스

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

dkwjdi 2021. 2. 25. 01:03

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

 

코딩테스트 연습 - 구명보트

무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5

programmers.co.kr

import java.util.Arrays; 
class Solution {
	    public int solution(int[] people, int limit) {
	        int answer = 0;
	        int left=0;
	        int right=people.length-1;
	        Arrays.sort(people);
	        
	        while(left<=right) {
	        	
	        	if(people[right]+people[left]<=limit) { //가벼운사람 + 무거운사람 가능 
	        		right--;
	        		left++;
	        		answer++;
	        	}
	        	else { // 둘이 같이 못타면 무거운 사람만 태움
	        		right--;
	        		answer++;
	        	}
	        }
	        
	        return answer;
	    }
	}

소요시간 : 10분

 

매우 간단한 문제입니다. n이 50000이기 때문에 n^2은 시간초과입니다!

그래서 그리디, 이분탐색인데 그리디인거 같아서 그리디로 풀었습니다!

 

여러명의 사람이 있을 때 가장 최소로 구명보트를 쓰는법은 간단합니다.

가장 무거운 사람 + 가장 가벼운 사람을 같이 구명보트에 태우는 방법을 사용하면 됩니다.

 

로직을 살펴보면

 

1. 몸무게를 오름차순으로 정렬

2. 가장 무거운 사람과 가장 가벼운 사람의 몸무게를 더했을 때 limit보다 작다면 구명보트 하나 추가

   -  left++, right-- 를 해서 인덱스를 옮겨줍니다.

3. 가장 무거운 사람과 가장 가벼운 사람의 몸무게를 더했을 때 limit보다 크면 구명보트하나 추가

   - 가장 무거운 사람만 구명보트에 타기 때문에 right--만 해줍니다.

 

끝~

Comments