Closed yeahdy closed 1 month ago
🤔 시간복잡도 고려사항
n<= 50,000, O(n logn)
💡 풀이 아이디어
문제 목표
: 모든 사람을 구출하기 위해 필요한 구명보트 개수의 최솟값
최선의 선택
: 가장 무거운 사람을 먼저 태움
Arrays.sort(people); // 오름차순
int left = 0; // 가장 가벼운 사람
for(int right = people.length -1; right>= left; right--){
if(people[left] + people[right] <= limit){ // 2명 태울 수 있는 경우
left++;
}
// 1명만 태울 수 있는 경우
answer++;
}
🤔 시간복잡도 고려사항
💡 풀이 아이디어
그리디
투 포인터
while (l <= r) {
// 작은 사람도 같이 태울 수 있는 지 확인, 아니라면 몸무게 큰 사람 혼자 타고 가기
if (people[l] + people[r] <= limit) {
l++;
}
r--;
answer++;
}
🤔 시간복잡도 고려사항
💡 풀이 아이디어
1명씩 태울 수 있는 수 - 2명씩 태울 수 있는 수
🤔 시간복잡도 고려사항
1 <= 무인도에 갇힌 사람의 수 <= 50,000
이므로 people
배열에 대해 2중 반복문을 사용하면 시간 초과O(N)
에 해결할 수 있음💡 풀이 아이디어
people
배열을 정렬한 뒤 Deque
에 담아줌while(!q.isEmpty())
pollLast
를 하며 숫자가 큰 것부터 처리pollLast > limit
라면 continue
pollLast + peekFirst
(큐에 남아 있는 제일 작은 값)과 pollLast + peekLast
(큐에 남아 있는 제일 큰 값)을 비교하며 더 크면서 limit
값보다 작거나 같은 값을 선택하여 조건에 해당하면 poll
하기쉬운 길로만 가지 말기 ㅎㅎ .... 주어진 자원을 최대로 활용해서 문제 풀이하는 습관 들이잣
🤔 시간복잡도 고려사항
O(NlogN)
💡 풀이 아이디어
무게순으로 나가야하기에 정렬
처음 아이디어: 큰값부터 보면서, limit-cur=target을 구해, target이 있다면 빼주는 방법 생각함
그래서 이분탐색으로 target값 구하고, target 이하 값이랑 같이 탈출할 수 있을때까지 while문으로 확인하는 방법을 풀었으나,, 시간초과 (잘못된 방법)
투포인터 문제
left
), 큰 값(right
)를 보면서 같이 나갈 수 있으면 나가기 : left++구현과정에서 쓸데없이 구현체들이 많이 필요하지고 코드가 더러워지는것 같다면,,, 설계가 잘못되진 않았는지 다시 살펴보자...ㅠㅠ
🤔 시간복잡도 고려사항
O(NlogN)
O(N)
O(NlogN)
💡 풀이 아이디어
두 지점을 양 끝에서 시작
end--
start++
end--