20. 두 큐 합 같게 만들기

aj4941·2023년 9월 5일
0

https://school.programmers.co.kr/learn/courses/30/lessons/118667

두 큐 중에서 작은 쪽의 합을 무조건 비워야 한다는 점이 중요했다.
합이 작은 쪽의 원소를 뺀다고 쳐도 결국엔 합이 큰 쪽의 첫번째 원소는 무조건 빼야 하는 것은 변함이 없다. 이게 O(1)이 되므로 합이 큰 것을 옮기는 작업을 반복하자.
큐 특성상 원소들의 위치가 섞이지는 않으므로 최악의 경우 두 큐의 사이즈의 합 만큼 반복되면
똑같은 원소가 다시 빠지는 상황이 발생할 것이다.
이 이상으로 넘어가면 정답이 없음을 판단하고 -1을 출력한다.

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int solution(vector<int> q1, vector<int> q2) 
{
    ll sum1 = 0, sum2 = 0;
    int ans = 0;
    deque<ll> dq1, dq2;
    for (auto to : q1) 
    {
        dq1.push_back(to);
        sum1 += to;
    }
    for (auto to : q2)
    {
        dq2.push_back(to);
        sum2 += to;
    }
    
    ll sz = q1.size() + q2.size();
    
    while (sum1 != sum2 && ans < sz * 2)
    {
        ll v1 = dq1.front(), v2 = dq2.front();
        if (sum1 < sum2)
        {
            dq2.pop_front(); sum2 -= v2;
            dq1.push_back(v2); sum1 += v2;
        }
        else
        {
            dq1.pop_front(); sum1 -= v1;
            dq2.push_back(v1); sum2 += v1;
        }
        ans++;
    }
    
    if (ans == sz * 2) ans = -1;
    return ans;
}```
profile
안녕하세요 aj4941 입니다.

0개의 댓글