프로그래머스 두 큐 합 같게 만들기 문제 풀이를 진행하였습니다.
문제를 읽으면 아래와 같은 해석이 가능합니다.
길이가 같은 두 개의 큐가 주어집니다.
하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다.
이때 필요한 작업의 최소 횟수를 구하고자 합니다.
한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.
두개의 큐와 누적합을 사용해주면 쉽게 값을 찾아낼 수 있습니다.
둘 중 누적합이 큰 쪽의 큐값을 push pop 해준 후 합이 같아지는지 확인해주면 됩니다.
모든 경우의 수를 탐색하기 위해서 queue길이의 4배만큼 값을 탐색해주었습니다.
#include <bits/stdc++.h>
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
int answer = -1;
long long q1sum = 0;
long long q2sum = 0;
queue<int> q1;
queue<int> q2;
//각각의 queue에 값 저장 및 각 큐의 누적합을 더해줌
for(int n : queue1){
q1sum += n;
q1.push(n);
}
for(int n : queue2){
q2sum += n;
q2.push(n);
}
//queue1.size()의 4배만큼 값을 검색
for(int i = 0; i < (queue1.size() << 2); i++)
{
if(q1sum < q2sum){
int curNum = q2.front(); q2.pop();
q1sum += curNum;
q2sum -= curNum;
q1.push(curNum);
}else if(q1sum > q2sum){
int curNum = q1.front(); q1.pop();
q2sum += curNum;
q1sum -= curNum;
q2.push(curNum);
}else{
return ++answer;
}
answer++;
}
return -1;
}
https://school.programmers.co.kr/learn/courses/30/lessons/118667