[문제]

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

 

 

[풀이]

 

먼저 두 입력값에 대해 각 Sum을 구하고 원소를 queue에 push 했다. 이후 루프문을 도는데, 조건은 각 queue의 size 합만큼 돌고, 이 횟수 내로 판단이 안될 시 실패로 간주하는 방식을 택했다. 두 큐의 자료들을 pop하고 push하는 과정을 모두 수행해도 결과를 만들어낼 수 없다면 실패한 것이기 때문이다. 그래도 그냥 제한이 넉넉해서 size 합의 * 2를 돌 수 있도록 했다. 

 

이제 각 큐의 합에 대해 크고 작음을 판단하면서, 큐를 팝하고 푸쉬하는 과정과 그에 대한 합의 변동을 기록한다. 도중에 바로 합이 같아지면 break를 실시하고 값을 리턴한다. 합이 같지 않아도 반복문은 종료되기 때문에, 반복문으로 축적된 answer 값을 그대로 리턴할 염려가 있어, bool값을 통해 예외 처리를 추가로 실시했다.

#include <string>
#include <vector>
#include <queue>

using namespace std;

// 하나의 큐에서 다른 큐로 넣으면서 두 큐의 합이 같도록 만듬
// pop -> insert를 1회 작업 수행으로 간주
// queue1,2[i] = 1 이상, 1'000'000'000
int solution(vector<int> queue1, vector<int> queue2) 
{
    int answer = -1;
    long Sum1 = 0;
    long Sum2 = 0;
    queue<long> Que1;
    queue<long> Que2;
    for (int Value : queue1)
    {
        Sum1 += Value;
        Que1.push(Value);
    }
    for (int Value : queue2)
    {
        Sum2 += Value;
        Que2.push(Value);
    }

    if (Sum1 == Sum2)
    {
        return answer = 0;
    }

    int Que1Size = queue1.size();
    int Que2Size = queue2.size();
    int Try = (Que1Size * 2) + (Que2Size * 2);
    bool IsTry = false;
    while (Try--)
    {
        ++answer;
        if (Sum1 < Sum2)
        {
            long Value2 = Que2.front();
            Que2.pop();
            Sum1 += Value2;
            Sum2 -= Value2;
            Que1.push(Value2);
        }
        else if (Sum1 > Sum2)
        {
            long Value1 = Que1.front();
            Que1.pop();
            Sum1 -= Value1;
            Sum2 += Value1;
            Que2.push(Value1);
        }
        else
        {
            IsTry = true;
            break;
        }
    }

    if (false == IsTry)
    {
        answer = -1;
    }

    return answer;
}

+ Recent posts