구명보트

공부한것 다 기록해·2023년 8월 4일
0

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

핵심 아이디어
배에 2명을 실을 수 있는가를 찾고 그렇지 않으면 1명을 실어준다.
투포인터를 이용하면 이중포문을 사용하지 않고 O(n)으로 문제를 해결할 수 있다.

문제풀이 흐름

사람 몸무게가 들어있는 배열을 정렬해준다.
투포인터 알고리즘을 사용해서 정렬된 배열의 양끝지점을 시작으로
두 사람의 몸무게의 합이 limit을 넘어가는 경우, 제일 무거운 사람만 실어나른다고 가정하고 answer++과 맨 오른쪽 포인트 인덱스 - 1을 해주었다.
그렇지 않은 경우에는 두 사람의 몸무게의 합이 limit을 넘어가지 않는 경우이기에 둘다 실어나른다고 가정하고 answer++과 맨 오른쪽 포인트 인덱스 - 1을 해주고 맨 왼쪽 포인트 인덱스 + 1을 해준다.
엇갈리게 되는 경우 투포인터 알고리즘 종료

class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;

        // 몸무게의 합이 limit이하면 된다.

        int l = 0;
        int r = people.length-1;

        Arrays.sort(people);

        while(l <= r){ // 투포인터 엇갈리면 끝
            int sum = people[r] + people[l];

            if(sum > limit){
                answer++;
                r--;
            }else{
                answer++;
                l++;
                r--;
            }
        }

        return answer;
    }
}

0개의 댓글