프로그래머스 - 두 큐 합 같게 만들기

KimGwangmin·2026년 10월 1일

문제 링크

제출 코드(통과)

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배 횟수만큼 작업을 수행하는 경우로 설정했다. 더 타이트한 상한이 있을 수도 있겠지만, 우선은 이걸로 충분했다.

0개의 댓글