KAKAO 2022 TECH INTERNSHIP의 문제였다.
문제 난이도는 그렇게 어려워 보이지 않았으나, 최적화가 힘들었다.
1차 시도 : Vector와 Pointer
실제로 Queue를 이용해서 합을 일일히 계산하려면 시간이 많이 걸릴 것이라는 판단.
그래서 Vector에 그대로 다 넣으면서 가리키는 포인터만 옮겨주는 방식으로 구현했다.
하지만 이 방식 또한 5개 정도의 시간초과가 발생했다.
#include <string>
#include <vector>
using namespace std;
bool validate(vector<int> queue1, vector<int> queue2) {
long long s1 = 0, s2 = 0;
for (auto i : queue1)
s1 += i;
for (auto i : queue2)
s2 += i;
if ((s1 + s2) % 2 != 0) return false;
return true;
}
int calc_rotate(vector<int> queue1, vector<int> queue2) {
int cnt = 0, ptr_1 = 0, ptr_2 = 0, q1_size = queue1.size(), q2_size = queue2.size();
long long sum_1 = 0, sum_2 = 0;
while (true) {
sum_1 = 0; sum_2 = 0;
for (int i = ptr_1; i < queue1.size(); i++)
sum_1 += queue1[i];
for (int i = ptr_2; i < queue2.size(); i++)
sum_2 += queue2[i];
if (sum_1 > sum_2) {
queue2.push_back(queue1[ptr_1]);
ptr_1++; cnt++;
}
else if (sum_1 < sum_2) {
queue1.push_back(queue2[ptr_2]);
ptr_2++; cnt++;
}
if (sum_1 == sum_2) break;
if (cnt > (q1_size + q2_size)*2) return -1;
}
return cnt;
}
int solution(vector<int> queue1, vector<int> queue2) {
int answer = -2;
if (!validate(queue1, queue2)) answer = -1;
else answer = calc_rotate(queue1, queue2);
return answer;
}
2차 시도
코드를 보다보니 내가 코드를 잘못 짰음을 금세 깨달을 수 있었다.
굳이 while loop 안에서 합을 계속 구할 필요가 있는가?
초기 합은 구해놓고, 옮긴 놈은 빼고 받은 놈은 더하기만 하면 된다!
#include <string>
#include <vector>
using namespace std;
bool validate(vector<int> queue1, vector<int> queue2) {
long long s1 = 0, s2 = 0;
for (auto i : queue1)
s1 += i;
for (auto i : queue2)
s2 += i;
if ((s1 + s2) % 2 != 0) return false;
return true;
}
int calc_rotate(vector<int> queue1, vector<int> queue2) {
int cnt = 0, ptr_1 = 0, ptr_2 = 0, q1_size = queue1.size(), q2_size = queue2.size();
long long sum_1 = 0, sum_2 = 0;
for (int i = ptr_1; i < queue1.size(); i++)
sum_1 += queue1[i];
for (int i = ptr_2; i < queue2.size(); i++)
sum_2 += queue2[i];
while (true) {
if (sum_1 > sum_2) {
sum_1 -= queue1[ptr_1];
queue2.push_back(queue1[ptr_1]);
sum_2 += queue2[queue2.size() - 1];
ptr_1++; cnt++;
}
else if (sum_1 < sum_2) {
sum_2 -= queue2[ptr_2];
queue1.push_back(queue2[ptr_2]);
sum_1 += queue1[queue1.size() - 1];
ptr_2++; cnt++;
}
if (sum_1 == sum_2) break;
if (cnt > (q1_size + q2_size) * 2) return -1;
}
return cnt;
}
int solution(vector<int> queue1, vector<int> queue2) {
int answer = -2;
if (!validate(queue1, queue2)) answer = -1;
else answer = calc_rotate(queue1, queue2);
return answer;
}