코딩테스트 연습 > 2022 KAKAO TECH INTERNSHIP > 두 큐 합 같게 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/118667
queue1
, queue2
- 두 배열의 합 / 2의 값 구하기 -> sum
- queue1Sum의 합이 sum 보다 큰지 or queue2Sum의 합이 sum 보다 큰지
- 둘 중 큰쪽 값을 pop해서 다른쪽에 넣어주고 count ++;
- queue1Sum === sum or queue2Sum === sum return.
시간초과..
try1.
function solution(queue1, queue2) {
var answer = 0;
const queue1Sum = [...queue1].reduce((a, b) => a + b);
const queue2Sum = [...queue2].reduce((a, b) => a + b);
if (queue1Sum === queue2Sum) return 0;
const sum = [...queue1, ...queue2].reduce((a, b) => a + b) / 2;
while (queue1.length > 0 && queue2.length > 0) {
const queue1Sum = [...queue1].reduce((a, b) => a + b);
const queue2Sum = [...queue2].reduce((a, b) => a + b);
if (queue1Sum > sum) {
const shift = queue1.shift();
queue2.push(shift);
answer++;
}
if (queue2Sum > sum) {
const shift = queue2.shift();
queue1.push(shift);
answer++;
}
if (queue1.length === 0 || queue2.length === 0) return -1;
if (queue1Sum === sum && queue2Sum === sum) {
return answer;
}
}
return answer === 0 ? -1 : answer;
}
shift
의 경우, O(n)
의 시간복잡도solved.
function solution(queue1, queue2) {
var answer = 0;
let triedCnt = 0,
queue1Index = 0,
queue2Index = 0,
triedLength = (queue1.length + queue2.length) * 2;
let sameQueue = false;
let queue1Sum = queue1.reduce((acc, val) => acc + val, 0);
let queue2Sum = queue2.reduce((acc, val) => acc + val, 0);
while (triedCnt < triedLength) {
if (queue1Sum > queue2Sum) {
const element = queue1[queue1Index++];
queue2Sum += element;
queue1Sum -= element;
queue2.push(element);
} else if (queue1Sum < queue2Sum) {
const element = queue2[queue2Index++];
queue1Sum += element;
queue2Sum -= element;
queue1.push(element);
} else {
sameQueue = true;
break;
}
triedCnt++;
}
return sameQueue ? triedCnt : -1;
}
triedLength = (queue1.length + queue2.length) 2;
여기서 2를 안해줘서 해맸었다...
solution([3, 3, 3, 3], [3, 3, 21, 3]); 케이스때문에..