[자료구조] 알고리즘

[프로그래머스] 구명보트(투포인터_JAVA)

콩지연 2023. 11. 29. 10:14

이틀 간 고민한 문제

알고리즘 분류가 greedy로 되어있어서,

한 가지 방법만 고민하다가

민성오빠의 힌트로 겨우 풀었다.

 


문제

 

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

 

프로그래머스

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

programmers.co.kr

 

 


설계

 

 

알고리즘 설계[접근 방법] : 투포인터

이 경우는 투포인터로 풀었다.

처음에는 정렬 후 차례로 무게를 더한 후 초과하면 count를 세는 것으로 풀었는데, 제출하니 틀린 문제가 많았다.
그래서 힌트를 듣고 투포인터로 다시 풀었다.


첫 번째 풀이 : 잘못된 풀이

1. 사람들 무게를 오름차순으로 정렬한다.

2. 1부터 n까지 반복문을 돌며, 무게를 더한다.

3. 무게가 limit를 넘으면 answer+1한다.

: 만약 20, 20, 80, 80이고 limit가 100인 경우 정답은 2지만, 이 풀이로 풀면 4가 나오게 된다.

 

두 번째 풀이 : 투포인터

1. 사람들 무게를 오름차순으로 정렬한다

2. 마지막 n-1부터 0까지 반복문을 돌며 무게를 더한다.

3. idx라는 변수는 0부터 시작하며, 만약 limit-people[i]가 people[idx]보다 크면 이 둘을 더한다.

4. 즉, 현재 가장 무거운 사람을 구명보트에 태우고, 가장 가벼운 사람을 태울 수 있으면 태운다.

5. 두 사람의 무게가 limit를 초과한다면 무거운 사람만 태운다.

 

 


코드

 

[첫 번째 풀이]

import java.util.*;

class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        
        //1. 무게 오름차순 정렬
        Arrays.sort(people);
        
        int sum=0;
        int count=0;
        for(int i=0; i<people.length; i++){
            sum+=people[i];
            count++;
            
            if(2<count || limit<sum) {
            	answer++;
            	sum=people[i];
                count=1;
            }
        }

        return answer;
    }
}

 

 

[두 번째 풀이]

import java.util.*;

class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        
        //1. 무게 오름차순 정렬
        Arrays.sort(people);
        
        //가벼운 사람 인덱스
        int idx=0;
        
        
        for(int i=people.length-1; i>=0; i--){
            if(i<idx) break;
            
            //3. 현재 기준 가장 무거운 사람 태운 후 가장 가벼운 사람 태울 수 있으면 태운다
            if(people[idx]<=limit-people[i]) {
                answer++;
                idx++;
            }
            
            //5. 아니면 무거운 사람만 태운다.
            else answer++;
        }

        return answer;
    }
}

 

 

(❁´◡`❁)

끝!