이제 익숙해져버린 시간초과... 이러면 안대!!!
12월 목표 : 시간초과와 멀어지자
<문제 요약>
- 길이가 같은 두개의 큐.
- 하나의 큐를 골라 원소 추출.
- 추출된 원소를 다른 큐에 집어넣음.
- 각 큐의 원소의 합이 같도록 만듦.
- return : 이때 필요한 작업의 최소 횟수는?
- pop과 insert를 합쳐서 1회로 간주.
- pop을 하면 배열의 첫번째 원소가 추출.
- insert를 하면 배열의 끝에 원소가 추가.
function solution(queue1, queue2) {
var answer = 0;
var sum1 = queue1.reduce((sum, cur) => {return sum + cur});
var sum2 = queue2.reduce((sum, cur) => {return sum + cur});
var len = queue1.length * 2;
for (let i = 0; i < len; i++)
{
if (queue1.length > 0)
sum1 = queue1.reduce((sum, cur) => {return sum + cur});
else
sum1 = 0;
if (queue2.length > 0)
sum2 = queue2.reduce((sum, cur) => {return sum + cur});
else
sum2 = 0;
if (sum1 == sum2)
break;
if (sum1 < sum2)
queue1.push(queue2.shift());
else
queue2.push(queue1.shift());
answer++;
}
if (answer == len)
answer = -1;
return answer;
}
var len = queue1.length * 2; # 에서
var len = queue1.length * 3; #으로 바꿨더니 점수가 오른다??
# *4는 바꿔봤자 시간초과만 더 커짐
function solution(queue1, queue2) { var answer = 0; var sum1 = queue1.reduce((sum, cur) => {return sum + cur}); var sum2 = queue2.reduce((sum, cur) => {return sum + cur}); var len = queue1.length * 3; for (let i = 0; i < len; i++) { if (sum1 == sum2) break; if (sum1 < sum2) { var tmp = queue2.shift(); queue1.push(tmp); sum1 += tmp; sum2 -= tmp; } else { var tmp = queue1.shift(); queue2.push(tmp); sum1 -= tmp; sum2 += tmp; } answer++; } if (answer == len) answer = -1; return answer; }
- 역시나!!! 시간이 확 단축되었음.
- 4개 시간초과로 86.7점을 얻음!
shift 시간 복잡도 : O(n) push 시간 복잡도 : O(1) # 맨 마지막에 요소를 집어넣기 때문에 시간이 크게 소요되지 않음
function solution(queue1, queue2) { var answer = 0; var sum1 = queue1.reduce((sum, cur) => {return sum + cur}); var sum2 = queue2.reduce((sum, cur) => {return sum + cur}); var len = queue1.length; var data; var q1_pos = [[0 ,len - 1], [0, -1]]; for (let i = 0; i < len * 3; i++) { if (sum1 == sum2) return answer; if (sum1 < sum2) { if (q1_pos[1][1] == len) { data = q1_pos[0][1] + q1_pos[0][0] + 2; if (data > len - 1) data = data - len; q1_pos[0][1]++; data = queue1[data]; } else { q1_pos[1][1]++; data = queue2[q1_pos[1][1]]; } sum1 += data; sum2 -= data; } else { if (q1_pos[0][1] == -1) { q1_pos[1][1]--; data = queue2[q1_pos[1][1]]; } else { data = queue1[q1_pos[0][0]]; q1_pos[0][1]--; if (q1_pos[0][0] == len - 1) q1_pos[0][0] = 0; else q1_pos[0][0]++; } sum1 -= data; sum2 += data; } answer++; } return -1; }
- q1_pos배열을 통해 [[queue1에서의 시작점, 길이],[queue2에서의 시작점, 길이]]를 주고, queue1 입장이 되어 값을 움직이며 해결해 나간 결과, 해결!
function solution(queue1, queue2) {
var answer = 0;
var q = [...queue1, ...queue2];
var len = queue1.length;
var q1 = 0;
var q2 = len;
var sum = queue1.reduce((sum, cur) => {return sum + cur});
var goal = q.reduce((sum, cur) => {return sum + cur}) / 2;
for(let i = 0; i < len * 3; i++)
{
if(sum == goal){
return answer;
}
if(sum < goal){
sum += q[q2];
q2++;
}else if(sum > goal){
sum -= q[q1];
q1++;
}
answer++;
}
return -1;
}