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;
}```