코딩테스트/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;
}