두 큐 합 같게 만들기(22분)

myeongrangcoding·2023년 11월 20일

프로그래머스

목록 보기
29/65

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

풀이

지하철에서 풀었다. 어려운 문제는 아닌데 while(tmp <= N * 3)이 구문이 중요하다. 한 개의 큐에서 값을 다 빼고 2배가 된 다른 큐에서 값을 가져와야 하는 경우가 있기 때문에 큐가 2개라고 n*2를 하면 안된다.

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

using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    int answer = -2;
    
    queue<long long> q1, q2;
    long long sum_q1 = 0, sum_q2 = 0;
    long long num_goal = 0;
    int N = queue1.size();
    
    for(int i = 0; i < N; ++i)
    {
        long long num_q1 = (long long)queue1[i];
        long long num_q2 = (long long)queue2[i];
        
        sum_q1 += num_q1;
        sum_q2 += num_q2;
        
        q1.push(num_q1);
        q2.push(num_q2);
    }
    
    num_goal = (sum_q1 + sum_q2) / 2;

    int tmp = 0;
    while(tmp <= N * 3)
    {
        // sum_q1과 sum_q2가 같아야 함.
        if(sum_q1 == sum_q2) break;
        else if(sum_q1 < sum_q2 && !q2.empty())
        {
            sum_q1 += q2.front();
            sum_q2 -= q2.front();
            
            q1.push(q2.front());
            q2.pop();
            ++tmp;
        }
        else if(sum_q1 > sum_q2 && !q1.empty())
        {
            sum_q1 -= q1.front();
            sum_q2 += q1.front();
            
            q2.push(q1.front());
            q1.pop();
            ++tmp;
        }
    }
    
    if(tmp == N * 3 + 1) tmp = -1;
    
    return answer = tmp;
}
profile
명랑코딩!

0개의 댓글