[JS] 두 큐 합 같게 만들기

DARTZ·2023년 6월 28일
0

알고리즘

목록 보기
126/135

처음 풀이 (오답 -> 시간초과)

function solution(queue1, queue2) {
    var answer = 0;
    let sum = 0;
    let count1 = 0;
    let count2 = 0;
    
    for (let i = 0; i < queue1.length; i ++) {
        sum += queue1[i]+ queue2[i];
        count1 += queue1[i];
        count2 += queue2[i];
    };
    
    if (sum % 2 !== 0) {
        return -1;
    };
    
    while (true) {
        if (count1 === sum / 2) return answer;
        if (count1 > count2) {
            const first = queue1.shift();
            if (first > sum / 2) return -1;
            queue2.push(first);
            count2 += first;
            count1 -= first;
        } else {
            const first = queue2.shift();
            if (first > sum / 2) return -1;
            queue1.push(first);
            count1 += first;
            count2 -= first;
        }
        answer += 1;
    }
    
    return answer;
}

문제에 충실히 구현했습니다. 다만 JS에서 큐를 구현하기 위한 shift()는 상당히 성능이 느리기 때문에 풀면서 시간 초과가 예상되었고 몇개의 테스트 케이스에서 시간 초과가 발생하였습니다.

정답 코드

function solution(queue1, queue2) {
    let answer = 0;
    let count1 = 0;
    let count2 = 0;
    let location1 = 0;
    let location2 = 0;
    const len = queue1.length;
    
    for (let i = 0; i < queue1.length; i ++) {
        count1 += queue1[i];
        count2 += queue2[i];
    };
    
    const sum = count1 + count2;
    while (answer < len * 3) {
        if (count1 === sum / 2) return answer;
        if (queue1[location1] > sum / 2 || queue2[location2] > sum / 2) return -1;
        if (count1 > count2) {
            count1 -= queue1[location1];
            count2 += queue1[location1];
            queue2.push(queue1[location1]);
            location1 += 1;
        } else {
            count2 -= queue2[location2];
            count1 += queue2[location2];
            queue1.push(queue2[location2]);
            location2 += 1;
        }
        answer += 1;
    }
    
    return answer === len * 3 ? -1 : answer;
}

이후에 포인터(location)를 통해 계속 배열에 추가하는걸로 해결했습니다. while문 횟수를 적용하지 않으면 무한 루프가 도는 경우가 있기 때문에 횟수를 배열 길이의 3배까지 설정했습니다.

참고 테스트케이스

[101, 100], [102, 103], -1

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글