알고리즘

[Lv_2] 두 큐 합 같게 만들기

deedee2 2023. 9. 18. 23:19
728x90

🔍 아이디어

✔️ 반복문의 시작에서 정답요건을 검증한다.

✔️ 요건에 충족되지 않은 경우, 합이 큰 쪽에서 작은 쪽으로 자신의 배열 요소를 넘겨준다.

✔️ 한 쪽 배열의 크기가 0이 되어도 정답이 나오지 않았거나, count가 비정상적으로 커진 경우는 체크해서 해결 불가능한 케이스로 처리한다.


import java.util.*;

class Solution {
    public long solution(int[] queue1, int[] queue2) {
        Queue<Long> q1 = new LinkedList<>();
        Queue<Long> q2 = new LinkedList<>();
        
        long sum_q1 = 0;
        long sum_q2 = 0;
        
        for (int i : queue1) {
            sum_q1 += (long) i;
            q1.add((long) i);
        }
        
        for (int j : queue2) {
            sum_q2 += (long) j;
            q2.add((long) j);
        }
        
        long goal = (sum_q1 + sum_q2) / 2;        
        long count = 0;
        
        while (true) {
            if (sum_q1 == sum_q2 && sum_q1 == goal) {
                break;
            }
            
            count += 1;
            
            if (sum_q1 > sum_q2) {                
                long poll = q1.remove();
                sum_q1 -= poll;
                
                q2.add(poll);
                sum_q2 += poll;
            } else if (q1.size() == 0 || q2.size() == 0) {
                return -1;
            } else {                
                long poll = q2.remove();
                sum_q2 -= poll;
                
                q1.add(poll);
                sum_q1 += poll;
            }
                       
            if (count > q1.size() * 5 + q2.size() * 5) {
                return -1;
            }
        }
        
        return count;
    }
}

✔️ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/118667