https://programmers.co.kr/learn/courses/30/lessons/42885
코딩테스트 연습 - 구명보트
무인도에 갇힌 사람들을 구명보트를 이용하여 구출하려고 합니다. 구명보트는 작아서 한 번에 최대 2명씩 밖에 탈 수 없고, 무게 제한도 있습니다. 예를 들어, 사람들의 몸무게가 [70kg, 50kg, 80kg, 5
programmers.co.kr
문제
설계
정렬된 자료에서 몸무게가 높은 순서로 뽑으면서 Count하되,
제일작은 사람과의 합이 limit을 넘지않으면 같이 뽑을 수 있도록,
Deque 자료구조를 활용하여, 정렬된 자료에서 앞뒤로 poll()을 해주도록 하였다
풀이
public static int solution(int[] people, int limit) {
int ans = 0;
ArrayDeque<Integer> dq = new ArrayDeque<Integer>();
Arrays.sort(people);
for(int i : people)
dq.add(i);
while(!dq.isEmpty()) {
if(dq.peekFirst()+dq.pollLast()<=limit &&!dq.isEmpty())
dq.pollFirst();
ans++;
}
return ans;
}
포인트
데크의 활용은 코드를 심플하게 할 뿐 아니라, 효율성을 극대화시킨다.
적절한 자료구조를 잘 알고있으면서, 활용하는게 참 중요한것 같다.
두번째는 검사문에서부터 제거하며 Count진행을 하는것!
그때 가장큰 값을 제거하고나서 데크가 비어있지는 않은지 한번더 체크해야 NullPointException을 막을수 있다.
다른사람의 풀이
public int solution(int[] people, int limit) {
Arrays.sort(people);
int i = 0, j = people.length - 1;
for (; i < j; --j) {
if (people[i] + people[j] <= limit)
++i;
}
return people.length - i;
}
자료구조마저 사용하지않고,
배열을 정렬해서 그냥 푸셨다.
'Algorithm > 프로그래머스 고득점 Kit' 카테고리의 다른 글
[그리디] 단속카메라 - Java코드 (프로그래머스 버그존재) (0) | 2021.07.30 |
---|---|
[그리디] 섬 연결하기 - Java코드 ★★★ (크루스칼, 신장트리) (0) | 2021.07.29 |
[그리디] 큰 수 만들기 - Java코드 ★★★ (0) | 2021.07.28 |
[그리디] 조이스틱- Java코드 ★★★ (0) | 2021.07.27 |
[그리디] 체육복 - Java코드 (0) | 2021.07.27 |