[JavaScript] 두 큐 합 같게 만들기

2022. 8. 23. 17:19Algorithm/프로그래머스

level : 2
문제 링크 : 두 큐 합 같게 만들기

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

My Solution

function solution(queue1, queue2) {
    let answer = -1;
    let sum1 = queue1.reduce((pre,cur)=>pre+cur,0);
    let sum2 = queue2.reduce((pre,cur)=>pre+cur,0);
    const middle = (sum1+sum2)/2;
    let temp = queue1.concat(queue2);
    let left = 0, right = queue1.length, count = 0;
    const len = temp.length;
    while(count < 2*len){
        if(sum1 > middle){
            sum1-=temp[left];
            if(left < len-1)
                left++;
            else
                left = 0;
        }
        else if(sum1<middle){
            sum1+=temp[right];
            if(right < len-1)
                right++;
            else
                right=0;
        }
        else
            return count;
        count++;
    }
    return answer;
}

풀이방법
이 문제는 javascript의 내장 메서드를 이용하여 계속 두 큐를 비교하고 enqueue와 dequeue의 행위를 반복하면 시간초과가 발생한다.
그리하여 두개의 큐를 합쳐 투 포인터를 이용하여 문제를 해결하였다.
queue1의 원소의 합을 sum1로 queue2의 원소의 합을 sum2로 명명하고 할당하였다.
middle을 이용하여 두 큐의 원소의 합의 절반을 할당하였다. (만약 원소 중 middle보다 큰 값이 있을 경우 두 큐의 합이 같아질 수 없다.)
temp에 queue1과 queue2가 합쳐진 하나의 Array를 만들었다.
left에는 0을 right에는 queue2의 첫 원소의 index를 집어넣었다.

count가 temp의 길이의 2배보다 작을때까지 아래의 행위를 반복하며 count를 1씩 증가시킨다.

(Dequeue 과정) => sum1이 middle보다 크면 sum1에서 temp[left]를 빼고 left를 1 증가시킨다. 이때, left가 temp의 마지막 원소를 가리킬 경우 left를 0으로 바꾼다.
(Enqueue 과정) =>sum1이 middle보다 작으면 sum1에서 temp[right]를 더하고 right를 1 증가시킨다. 이때, right가 temp의 마지막 원소를 가리킬 경우 right를 0으로 바꾼다.
만약 sum1이 middle과 같다면 count를 반환한다.

반복문을 빠져나온다면 두 큐가 같아지는 구간이 없기에 -1을 반환한다.

느낀점
삼항 연산자를 쓰면 더욱 깔끔해 질 거 같은 부분이 있다. 조금더 깔끔하고 간결하게 쓰는 것이 시각적으로나 심적으로 편안하다.

'Algorithm > 프로그래머스' 카테고리의 다른 글

[JavaScript] 네트워크  (0) 2022.09.01
[JavaScript] 위장  (0) 2022.08.31
[JavaScript] 올바른 괄호  (0) 2022.08.23
[JavaScript] 수식 최대화  (0) 2022.08.16
[JavaScript] 거리두기 확인하기  (0) 2022.08.15