알고리듬/문제
[programmers] 두 큐 합 같게 만들기
narmeee
2023. 5. 9. 11:25
문제 설명
길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.
길이가 같은 두 개의 큐를 나타내는 정수 배열 queue1, queue2가 매개변수로 주어집니다. 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수를 return 하도록 solution 함수를 완성해주세요. 단, 어떤 방법으로도 각 큐의 원소 합을 같게 만들 수 없는 경우, -1을 return 해주세요.
제한사항
- 1 ≤ queue1의 길이 = queue2의 길이 ≤ 300,000
- 1 ≤ queue1의 원소, queue2의 원소 ≤ 109
- 주의: 언어에 따라 합 계산 과정 중 산술 오버플로우 발생 가능성이 있으므로 long type 고려가 필요합니다.
풀이
입력이 vector 로 주어지는데 이를 큐로 변환해주고 합이 큰 queue에서 작은 queue로 옮겨준다.
개념은 쉬운데 최대 반복을 몇번 돌릴지가 문제이다.
한 queue 원래 상태로 돌아오려면 총 4n 만큼 움직여야해서 (길이가 긴 queue.size) * 4로 제한을 뒀다. (맞는지는 모르겠다..)
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
int answer = -1;
long long queue1_sum = 0, queue2_sum = 0;
queue<int> q1, q2;
for(auto num : queue1){
queue1_sum += num;
q1.push(num);
}
for(auto num : queue2){
queue2_sum += num;
q2.push(num);
}
if((queue1_sum % 2 + queue2_sum % 2) % 2 != 0)return -1;
int cnt = 0, idx1 = 0, idx2 = 0;
int maxcnt = queue1.size() > queue2.size() ? queue1.size()*4 : queue2.size()*4;
while(queue1_sum != queue2_sum && (idx1 < maxcnt && idx2 < maxcnt)){
if(queue1_sum > queue2_sum){
int temp = q1.front();
q1.pop();
queue1_sum -= temp;
queue2_sum += temp;
q2.push(temp);
idx1++;
}else{
int temp = q2.front();
q2.pop();
queue2_sum -= temp;
queue1_sum += temp;
q1.push(temp);
idx2++;
}
cnt++;
}
answer = queue1_sum == queue2_sum ? cnt : -1;
return answer;
}