[프로그래머스] 두 큐 합 같게 만들기 (C++)

jiyehyeon·2022년 8월 19일
0

뭣모르고 플래티넘 문제 잡고 스트레스 받다가
정신을 차리고 레벨1부터 차근차근 풀어보기로 했다.

문제: https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=cpp

나의 풀이 (C++) :
두 큐의 합을 같게 만드는 문제인데, 배열 크기가 최대 30000이라 자꾸 넣었다 뺐다 하면 혹시나 시간초과가 날까봐 인덱스 변수를 잡고 했다.
push_back()은 N(1)이라 괜찮은데 erase()가 N(n)이라고 한다.
sum도 초기값만 잡고 그뒤론 숫자계산으로 진행했다.
accumulate()도 시간복잡도 N(n)이란다..
자꾸 테스트케이스 3-4개에서 틀려서 뭔지 한참 봤는데 원소 최댓값 때문에 변수타입을 long으로 지정해주어야 했다. 역시 답이 지시사항을 꼭 꼼꼼히 봐야해.

#include <string>
#include <vector>
#include <numeric>
using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    long elem, sum1, sum2;
    int idx1 = 0, idx2 =0;
    int cnt = 0;
    
    int qSize = queue1.size();
    sum1 = accumulate(queue1.begin(), queue1.end(), 0);
    sum2 = accumulate(queue2.begin(), queue2.end(), 0);
    
    while (cnt <= qSize * 4){
        if(sum1==sum2) return cnt;
        else if(sum1<sum2){
            elem = idx2 < qSize? queue2[idx2]:queue1[idx2-qSize];
            sum2 -= elem;
            sum1 += elem;
            idx2++;
            cnt++;
        }
        else{
            elem = idx1 < qSize? queue1[idx1]:queue2[idx1-qSize];
            sum1 -= elem;
            sum2 += elem;
            idx1++;
            cnt++;
        }
    }

    return -1;
}

다른 풀이1 (C++) :
나같은 경우 안되는 경우의 수를 카운트가 일정 수 이상(전체 큐 사이즈*2) 즉 두번정도 왕복으로 왔다갔다 했는데도 안되면 false인걸로 처리했다.
근데 sum1+sum2가 홀수이면 그냥 어떻게 해도 안되는 결말이었던 것이었다
아아 .. 이래서 머리가 좋아야 된다 이제라도 알았으니 외우기라도 해야지 ㅠ
저런 생각은 어떻게 하는거죠 ???

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    int answer{};

    long long sumQ1{};
    long long sumQ2{};
    int size{ static_cast<int>(queue1.size()) };
    for (int i = 0; i < queue1.size(); i++)
    {
        sumQ1 += queue1[i];
        sumQ2 += queue2[i];
    }
    if ((sumQ1 + sumQ2) % 2 == 1)
    {
        return -1;
    }
    int strQ1{};
    int strQ2{};
    while (true)
    {
        if (strQ1 > size && strQ2 > size)
        {
            return -1;
        }
        if (sumQ1 == sumQ2)
        {
            break;
        }
        else if (sumQ1 > sumQ2)
        {
            if (strQ1 == queue1.size() - 1)
            {
                return -1;
            }
            sumQ1 -= queue1[strQ1];
            queue2.push_back(queue1[strQ1]);
            sumQ2 += queue1[strQ1++];

        }
        else
        {
            if (strQ2 == queue2.size() - 1)
            {
                return -1;
            }
            sumQ2 -= queue2[strQ2];
            queue1.push_back(queue2[strQ2]);
            sumQ1 += queue2[strQ2++];
        }
        answer++;
    }

    return answer;
}

다른풀이2 (C++) :
찐 큐로 옮겨서 푸신 분도 있다.

#include <string>
#include <vector>
#include <queue>
#include <numeric>

using namespace std;

int solution(vector<int> queue1, vector<int> queue2) {
    queue<int> q1 {{begin(queue1), end(queue1)}};
    queue<int> q2 {{begin(queue2), end(queue2)}};
    long long sum1 = accumulate(begin(queue1), end(queue1), 0ll);
    long long sum2 = accumulate(begin(queue2), end(queue2), 0ll);
    if((sum1 + sum2) % 2 != 0) return -1;
    size_t s1 = q1.size(), s2 = q2.size();
    int cnt = 0;
    while(sum1 != sum2) {
        if(cnt > s1 + s2 + 2) return -1;
        if(sum1 < sum2) {
            q1.push(q2.front());
            sum1 += q2.front();
            sum2 -= q2.front();
            q2.pop();
        }
        else {
            q2.push(q1.front());
            sum2 += q1.front();
            sum1 -= q1.front();
            q1.pop();
        }
        ++cnt;
    }
    return cnt;
}
profile
https://github.com/jiyehyeon

0개의 댓글

관련 채용 정보