프로그래밍/코딩테스트

코딩테스트 : 두 큐 합 같게 만들기

백사니 2025. 2. 5. 15:53
728x90
반응형

해당 문제는 두 큐의 합을 같게 만들어주는 문제로 queue의 특징을 이용해서 합이 같아질때까지 원소를 옮기는 문제이다.

문제를 푸는 법은 간단한데 반복문으로 원소를 옮기면서 예외 처리를 한개씩 해주면 된다.

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

using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    int answer = 0;
    queue<int> q1;
    queue<int> q2;
    long sum1 = 0;
    long sum2 = 0;
    
    //vector에 저장되어있는 정보를 queue로 옮긴다.
    for(int i =0; i < queue1.size(); i++)
    {
        q1.push(queue1[i]);
        q2.push(queue2[i]);
        
        //옮기면서 해당 큐의 전체 합을 구한다.
        sum1 += queue1[i];
        sum2 += queue2[i];
    }
    
    //만약 합이 홀수면 두 큐는 같아질 수 없음
    if((sum1 + sum2) % 2 != 0)
        return -1;
    
    //만약 큐의 크기가 0이라면 비교가 불가능하므로 옮기는걸 멈춘다.
    while(!(q1.size() < 1 || q2.size() < 1))
    {
		    //만약 이동 횟수가 전체 두 큐의 2배보다 크다면 - 이미 큐 전체를 돌았는데 같지 않을때
        if(answer / 2 > q1.size() + q2.size())
		        //실패 반환
            return -1;
        
        //queue1의 합이 더 크다면
        if(sum1 > sum2)
        {
		        //queue1의 값 한개를 빼서
            sum1 -= q1.front();
            //queue2에 옮긴다.
            sum2 += q1.front();
            q2.push(q1.front());
            q1.pop();
            //----
            //옮겼으니 answer를 한개 올린다.
            answer++;
        }
        //queue2의 합이 크다면 위와 같이 옮긴다.
        else if(sum1 < sum2)
        {
            sum1 += q2.front();
            sum2 -= q2.front();
            q1.push(q2.front());
            q2.pop();
            answer++;
        }
        //만약 합이 같다면 현재 answer를 반환
        else if(sum1 == sum2)
            return answer;
    }
    
    //queue에 원소가 1개 남았을 때 같아진다면
    if(sum1 == sum2)
        return answer;
    
    //위 모든 과정에서 같지 않다면 다르다는 뜻이니 -1 반환
    return -1;
}
728x90
반응형