https://school.programmers.co.kr/learn/courses/30/lessons/42885
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 풀이 (JAVA)
import java.util.*;
class Solution {
public int solution(int[] people, int limit) {
int answer = 0;
int len = people.length;
Arrays.sort(people); // 오름차순 정렬
int lt=0,rt=len-1; // 왼쪽 포인터 = 최소값, 오른쪽 포인터 = 최대값
int sum=0;
while(lt <= rt){
// sum > limit라면 lt==rt가 될수있고, sum<=limit라면 lt>rt의 경우가 생기므로 조건설정
sum = people[lt] + people[rt];
if(sum > limit){ // 무게제한을 초과한다면
answer++;
rt--; // 오른쪽 포인터만 증가
}
if(sum <= limit){ // 무게제한을 맞췄다면
lt++; // 왼쪽 포인터 증가 = 다음 최소값
rt--; // 오른쪽 포인터 감소 = 다음 최대값
answer++;
}
}
return answer;
}
}
주요 핵심 포인트
1. 최소한의 구명보트 수를 구하려면 최대몸무게를 가진사람 + 최소몸무게를 가진사람이 같이 타야 한다.
2. 배열을 오름차순 정렬하여 무게를 최소~최대로 정렬하였다.
3. 왼쪽 포인터는 최소 몸무게를 가진 사람 , 오른쪽 포인터는 최대 몸무게를 가진사람으로 두 사람의 몸무게 합이 초과한다면 최대 몸무게를 가진사람은 혼자 타야 하고, 다음 최대 몸무게를 가진사람과 비교하여야 한다.
4. while문이 계속 반복한 결과 lt와 rt가 만나는 지점에서 rt만 감소하는 경우 lt==rt가 되고, lt는 증가하고, rt는 감소하는 경우 lt > rt 가 되므로 while문 조건을 lt <= rt로 설정해주었다.
5. while문이 종료했을시 최적의 구명보트 숫자를 리턴한다.
개선해야할 사항
: 위 문제를 이해하고 투포인터를 적용하는데에는 1시간 이상 걸렸다. 투 포인터의 문제 중 기본적인 문제이므로 문제의 접근 방식을 좀 더 빠르게 발견하는 연습을 해야겠다.