뭣모르고 플래티넘 문제 잡고 스트레스 받다가
정신을 차리고 레벨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;
}