티스토리 뷰
728x90
복잡한듯 복잡하지 않은 문제였다.
카카오 공식 풀이에서는 그리디와 투포인터 2가지 해결 방법을 제시한다.
풀이 아이디어를 얻기까지는 꽤 어려웠으나
단순하게 한쪽 큐의 전체합이 최적해가 되는지만 판별하는 그리디라는 문제라는 것을 알고나서 구현하는 것은 매우 쉬웠다.
그리디 문제인지를 알아채기는 힘들지만 찾고나면 구현하기는 쉽다는 점이 그리디 문제의 특징인 것같다.
맨 처음 풀이는 아래 코드보다 시간복잡도가 좋지않게 풀었으나 단순 순회를 여러번 반복하는 것뿐이라 통과 자체에는 문제가 생기지 않았다.
import java.util.*;
class Solution {
//시간복잡도 nlogn 제한
int helper(LinkedList<Long> q1, LinkedList<Long> q2, long q1Sum, long q2Sum) {
var count = 0;
var sum = q1Sum + q2Sum;
if (sum % 2 == 1) return -1;
var length = q1.size() + q2.size();
//부분합의 최대 구하기.
while (true) {
//count가 30만 + 30만 = 60만을 넘어가면 범위 내에서 최적해 불가능.
if (count > 600001) {
return -1;
}
//q1의 합이 전체/2와 같아지면
if (q1Sum == sum/2) {
return count;
//q1의 합이 전체/2보다 크다면
} else if (q1Sum > sum/2) {
var poll = q1.poll();
q2.offer(poll);
q2Sum += poll;
q1Sum -= poll;
//q1의 합이 전체/2보다 작으면
} else if (q1Sum < sum/2) {
var poll = q2.poll();
q1.offer(poll);
q1Sum += poll;
q2Sum -= poll;
}
count++;
}
}
public int solution(int[] queue1, int[] queue2) {
var q1 = new LinkedList<Long>();
var q2 = new LinkedList<Long>();
var q1Sum = 0L;
var q2Sum = 0L;
for (var i : queue1) {
q1.offer((long)i);
q1Sum += (long) i;
}
for (var i : queue2) {
q2.offer((long)i);
q2Sum += (long) i;
}
return helper(q1, q2, q1Sum, q2Sum);
}
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 레디스
- 루나빔
- RequestBody
- RequestParam
- vim
- JavaScript
- lunarvim
- ModelAttribute
- Dap
- RequestPart
- 도커
- 배포
- 아키텍처
- IDE
- neovim
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함