단순히 탐욕법으로 한쪽이 크면 옮기는 방식으로 풀이했다.
하지만 자바스크립트 배열 특성상 shift, push 연산이 오래걸리는 것 같아
시간초과가 발생했다.
function solution(queue1, queue2) {
let count = 0;
let total1 = queue1.reduce((a,b)=>a+b);
let total2 = queue2.reduce((a,b)=>a+b);
const MAXCOUNT = (queue1.length-1)*3;
if((total1+total2)%2)
return -1
while(count<MAXCOUNT){
if(total1 > total2){
let temp = queue1.shift();
queue2.push(temp);
total2+=temp;
total1-=temp;
}else if(total1 < total2){
let temp = queue2.shift();
queue1.push(temp);
total1+=temp;
total2-=temp;
}else{
return count;
}
count++;
}
return -1
}
배열을 넣고 빼는 연산 없이 투포인터 방식으로 풀이했다.
큐1의 시작과 끝을 잡고 전체값/2 보다 작으면 끝을 늘리고,
크면 시작을 올리는 방식으로 풀이했다.
테스트케이스1의 경우 맥스카운트값을 전체길이X2로 하면 걸려버리던데..
넉넉하게 잡아서 해결하긴 했으나 많이 찝찝하다. 공식이 있는걸까?
function solution(queue1, queue2) {
const TOTAL_ARRAY = [...queue1, ...queue2];
const MAXCOUNT = 4*TOTAL_ARRAY.length;
const sum = (array)=>array.reduce((a,b)=>a+b);
const TARGET = sum(TOTAL_ARRAY)/2;
let count = 0;
let start = 0;
let end = queue1.length;
let totalSum = sum(TOTAL_ARRAY.slice(start, end));
while(count<=MAXCOUNT){
if(TARGET > totalSum){
totalSum += TOTAL_ARRAY[end];
end++;
}else if(TARGET < totalSum){
totalSum -= TOTAL_ARRAY[start];
start++;
}else if(TARGET === totalSum){
return count;
}
count++;
}
return -1;
}
안녕하세요.
문제 풀면서 돌아보다가 투포인터 방식에서 고민하셨던 부분
https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/
해설에서 각 포인터당 움직일 수 있는 총 횟수가 2n이라 총 4n이라고 설명을 해두었던 부분이 있는데, 도움이 될 것 같아서 댓글드립니다.
저도 풀이보고 도움을 받아서 남기고 갑니다. 감사합니다.