Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스택
- java leetcode
- 리트코드
- 백준 16935
- 카카오
- 그래프 자바
- Java
- 코딩테스트
- leetcode
- 코테
- 자바
- leetcode 1721
- dfs
- 프로그래머스 java
- BFS
- 분할정복
- 인텔리제이 에러
- 리트코드 자바
- 구현
- 파이썬
- 자바 리트코드
- 리트코드 1557
- 프로그래머스
- 자바 5464
- DP
- daily challenge
- 백준 18222
- 스프링 에러
- 백준
- java 프로그래머스
Archives
- Today
- Total
레벨업 일지
[Java] 프로그래머스 구명보트 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/42885?language=java
최소한의 개수로 사람들을 보트에 다 태우자.
필요한 개념
- 투 포인터
풀이
풀이는 다음과 같다.
- 양 끝에 있는 사람 몸무게의 합이 limt 이하이면 두 사람 모두 태운다.
- 그 이외에는 몸무게가 큰 right 를 먼저 태운다.
- 정답을 리턴한다.
왜 투 포인터 인가?
주어진 조건을 보면 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고
라 적혀있다. 오름차순으로 정렬된 배열이 있을 때 극단적인 경우의 수를 생각해 보자.
- 몸무게가 작은 두 명을 태우는 것
- 몸무게가 큰 두 명을 태우는 것
- 몸무게가 큰 사람, 작은 사람 한 명씩 태우는 것
이렇게 3 가지가 있다. 그리디적인 측면에서 봤을때 부분적인 최적해는 3번째 큰거 하나 작은거 하나 씩 태우는 것이
아직 보트에 타지 않은 사람 총 몸무게가 가장 많이 줄어든다. 그래서 나중에는 무조건 2명씩 태울 수 있을 것이다.
그러면 2명을 못 태울 경우는 당연히 몸무게가 큰 사람을 태워야 보트 안탄 총 몸무게가 가장 많이 줄어든다.
코드
자바
import java.util.*;
class Solution {
public int solution(int[] p, int limit) {
int answer = 0;
int left =0 ;
int right = p.length-1;
Arrays.sort(p);
while(left <= right){
if(p[left] + p[right] <= limit){
left++;
right--;
}else{
right--;
}
answer++;
}
return answer;
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 마법의 엘리베이터 (0) | 2023.01.30 |
---|---|
[Java] 프로그래머스 택배 배달과 수거하기 (0) | 2023.01.29 |
[Java] 프로그래머스 개인정보 수집 유효기간 (0) | 2023.01.28 |
[Java] 프로그래머스 시소 짝꿍 (2) | 2023.01.26 |
[Java] 프로그래머스 단속카메라 (0) | 2023.01.24 |
Comments