[프로그래머스]

프로그래머스 두 큐 합 같게 만들기 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;
}

 

반응형