[프로그래머스]
프로그래머스 두 큐 합 같게 만들기 C++
Hevton
2023. 8. 18. 14:31
반응형
테스트케이스 19 ~ 20,
23 ~ 27이 오류가 나시는 분들은 long type으로 바꿔주셔야 합니다.
#include <string>
#include <vector>
#include <iostream>
#include <queue>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
long answer = 0;
// 한쪽만 생각하면 다른쪽 완성
// 3 2 7 2 = 14
// 4 6 5 1 = 16
// 투포인터. 1을 만들 수 있느냐
// -3 -2 -7 -2
// +4 +6 +5 +1
// 시간복잡도 O(2n)
int p1 = 0;
int p2 = 0;
int size = queue1.size();
long t1 = 0;
queue<int> que1;
for(auto t : queue1) {
t1 += t;
que1.push(t);
}
queue<int> que2;
long t2 = 0;
for(auto t : queue2) {
t2 += t;
que2.push(t);
}
long sum = t1 + t2;
// 홀수
if(sum % 2 == 1)
return -1;
long oneResult = t1;
long need = (sum / 2) - oneResult; // 필요한 수
long now = 0;
// need = 4, now = 0
while(answer < size * 2) {
while(!que1.empty() && now > need) {
int top = que1.front();
que1.pop();
now -= top;
que2.push(top);
answer++;
}
if(now == need)
return answer;
int top = que2.front();
que2.pop();
now += top;
que1.push(top);
answer++;
}
return -1;
}
투 포인터를 이용해서 풀긴 했는데, 코드가 너무 지저분해서 다시 다른 분의 풀이를 보고 다시 풀어본다.
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
long answer = 0;
long sum1 = 0, sum2 = 0;
int p1 = 0, p2 = 0;
for(auto n : queue1)
sum1 += n;
for(auto n : queue2)
sum2 += n;
if((sum1 + sum2) % 2 == 1) return -1; // 홀수는 불가능
int size = queue1.size();
while(answer < size * 3) {
if(sum1 < sum2) {
queue1.push_back(queue2[p2]);
sum1 += queue2[p2];
sum2 -= queue2[p2];
p2++;
} else if(sum1 > sum2) {
queue2.push_back(queue1[p1]);
sum1 -= queue1[p1];
sum2 += queue1[p1];
p1++;
} else
return answer;
answer++;
}
return -1;
}
반응형