제출 코드(통과)
using System;
public class Solution {
public int solution(int[] queue1, int[] queue2)
{
var queue = new int[queue1.Length + queue2.Length];
queue1.CopyTo(queue, 0);
queue2.CopyTo(queue, queue1.Length);
long sum1 = 0;
foreach (var i in queue1) sum1 += i;
long sum2 = 0;
foreach (var i in queue2) sum2 += i;
var sum = sum1 + sum2;
if (sum % 2 != 0) return -1;
var index1 = 0;
var index2 = queue1.Length;
var answer = 0;
while (sum1 != sum2 && answer < queue.Length * 2)
{
if (sum1 > sum2)
{
var num = queue[index1];
sum1 -= num;
sum2 += num;
index1 = (index1 + 1) % queue.Length;
}
else
{
var num = queue[index2];
sum1 += num;
sum2 -= num;
index2 = (index2 + 1) % queue.Length;
}
answer++;
}
return sum1 == sum2 ? answer : -1;
}
}
한 쪽 큐에서 꺼낸 걸 즉시 다른 쪽 큐에 넣어야 하므로, 둘을 하나의 원형 큐로 이은 뒤 인덱스를 옮기는 것으로 작업 하나를 나타낼 수 있다. index1에서 index2-1까지는 첫 번째 큐, 나머지는 두 번째 큐로 간주된다. 완성될 수 없음을 판단하는 작업 상한은 두 인덱스가 한 바퀴를 돌아 원래 자리로 돌아오는 경우, 즉 전체 길이의 2배 횟수만큼 작업을 수행하는 경우로 설정했다. 더 타이트한 상한이 있을 수도 있겠지만, 우선은 이걸로 충분했다.