728x90
반응형
해당 문제는 두 큐의 합을 같게 만들어주는 문제로 queue의 특징을 이용해서 합이 같아질때까지 원소를 옮기는 문제이다.
문제를 푸는 법은 간단한데 반복문으로 원소를 옮기면서 예외 처리를 한개씩 해주면 된다.
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(vector<int> queue1, vector<int> queue2) {
int answer = 0;
queue<int> q1;
queue<int> q2;
long sum1 = 0;
long sum2 = 0;
//vector에 저장되어있는 정보를 queue로 옮긴다.
for(int i =0; i < queue1.size(); i++)
{
q1.push(queue1[i]);
q2.push(queue2[i]);
//옮기면서 해당 큐의 전체 합을 구한다.
sum1 += queue1[i];
sum2 += queue2[i];
}
//만약 합이 홀수면 두 큐는 같아질 수 없음
if((sum1 + sum2) % 2 != 0)
return -1;
//만약 큐의 크기가 0이라면 비교가 불가능하므로 옮기는걸 멈춘다.
while(!(q1.size() < 1 || q2.size() < 1))
{
//만약 이동 횟수가 전체 두 큐의 2배보다 크다면 - 이미 큐 전체를 돌았는데 같지 않을때
if(answer / 2 > q1.size() + q2.size())
//실패 반환
return -1;
//queue1의 합이 더 크다면
if(sum1 > sum2)
{
//queue1의 값 한개를 빼서
sum1 -= q1.front();
//queue2에 옮긴다.
sum2 += q1.front();
q2.push(q1.front());
q1.pop();
//----
//옮겼으니 answer를 한개 올린다.
answer++;
}
//queue2의 합이 크다면 위와 같이 옮긴다.
else if(sum1 < sum2)
{
sum1 += q2.front();
sum2 -= q2.front();
q1.push(q2.front());
q2.pop();
answer++;
}
//만약 합이 같다면 현재 answer를 반환
else if(sum1 == sum2)
return answer;
}
//queue에 원소가 1개 남았을 때 같아진다면
if(sum1 == sum2)
return answer;
//위 모든 과정에서 같지 않다면 다르다는 뜻이니 -1 반환
return -1;
}
728x90
반응형
'프로그래밍 > 코딩테스트' 카테고리의 다른 글
코딩테스트 : 삼각 달팽이 (0) | 2025.02.09 |
---|---|
코딩테스트 : 큰 수 만들기 (0) | 2025.02.09 |
코딩테스트 : 가장 큰 수 (0) | 2025.02.05 |
코딩테스트 : [1차] 프랜즈4블록 (0) | 2025.02.04 |
코딩테스트 : [1차] 캐시 (0) | 2025.02.04 |