[프로그래머스] 두 큐 합 같게 만들기 JavaScript 투포인터

1

Problem Solving

목록 보기
38/49
post-thumbnail

첫번째 풀이 (시간초과)

단순히 탐욕법으로 한쪽이 크면 옮기는 방식으로 풀이했다.
하지만 자바스크립트 배열 특성상 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;
}

2개의 댓글

comment-user-thumbnail
2022년 8월 26일

안녕하세요.
문제 풀면서 돌아보다가 투포인터 방식에서 고민하셨던 부분
https://tech.kakao.com/2022/07/13/2022-coding-test-summer-internship/
해설에서 각 포인터당 움직일 수 있는 총 횟수가 2n이라 총 4n이라고 설명을 해두었던 부분이 있는데, 도움이 될 것 같아서 댓글드립니다.
저도 풀이보고 도움을 받아서 남기고 갑니다. 감사합니다.

1개의 답글