2022. 8. 23. 17:19ㆍAlgorithm/프로그래머스
level : 2
문제 링크 : 두 큐 합 같게 만들기
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 |