코딩테스트/C++
[프로그래머스 Level 2] 두 큐 합 같게 만들기(C++)
최-코드
2024. 5. 3. 02:36
코딩테스트 연습 - 두 큐 합 같게 만들기 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
지문을 보면 어떻게 접근하라하는지 나타나있다. 여기서 주의할 점으로는 두 큐의 총 합이 홀수일 때는 두 큐의 합을 같에 못 하므로 바로 -1로 리턴 해주면 된다. 두 번째로 주의해야 할 점은 두 큐의 총 갯수보다 더 많은 for문을 돌면 정답이 없는 것으로 -1을 리턴해주면 된다. 두 큐를 모두 pop과 push하고도 더 도는 경우는 답이 될 수 없는 경우이다.
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
int answer = -2;
queue<int> q1;
long long sum1 = 0;
queue<int> q2;
long long sum2 = 0;
int mNum = 0;
for (int i = 0; i < queue1.size(); i++) {
q1.push(queue1[i]);
sum1 += queue1[i];
q2.push(queue2[i]);
sum2 += queue2[i];
mNum = max({ queue1[i],queue2[i],mNum });
}
long long midSum = sum1 + sum2;
if (midSum % 2 == 1 || mNum> midSum /2) {
return answer = -1;
}
midSum = midSum / 2;
int count = 0;
bool checked = false;
while ((!q1.empty() && !q2.empty()) && count<queue1.size()+queue2.size()+100) {
if (sum1 == sum2) {
checked = true;
break;
}
if (sum1 > midSum) {
int tmp = q1.front();
q1.pop();
sum1 -= tmp;
sum2 += tmp;
q2.push(tmp);
}
else {
int tmp = q2.front();
q2.pop();
sum2 -= tmp;
sum1 += tmp;
q1.push(tmp);
}
count++;
}
if (checked) {
answer = count;
}
else {
answer = -1;
}
return answer;
}