본문 바로가기

프로그래머스/구현

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

반응형

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/118667#qna

 

프로그래머스

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

programmers.co.kr

2. 코드

처음 푼 코드) 당연한 타임아웃

function solution(queue1, queue2) {
    let answer = 0;
    // 두 큐 요소 합 구하기
    // 두 큐 중 합 큰 것에서 하나 빼서 옮기기
    queue1 = queue1.reverse();
    queue2 = queue2.reverse();
    let sum1 = queue1.reduce((acc,cur) => acc += cur,0);
    let sum2 = queue2.reduce((acc,cur) => acc += cur,0);
    if((sum1+sum2)/2 !== Math.floor((sum1+sum2)/2)) return -1;
    
    while(sum1 !== (sum1+sum2)/2){
        if(!sum1 || !sum2 || (sum1+sum2)/2 !== Math.floor((sum1+sum2)/2)) return -1;
        if(sum1 > sum2) queue2.unshift(queue1.pop());
        else queue1.unshift(queue2.pop());
        sum1 = queue1.reduce((acc,cur) => acc += cur,0);
        sum2 = queue2.reduce((acc,cur) => acc += cur,0);
        answer ++;
    }
    
    return answer;
}

정답 코드)

이 문제는 문제 그대로 보고 큐로 해야겠네~ 이러면 타임아웃 지옥에 빠지게 된다. 

투포인터를 사용하여 두 개의 큐를 하나로 합치고, 포인터를 두어 앞뒤로 왔다갔다하며 비교하도록 해야한다.

두 큐의 길이가 같으므로, qPointer1은 0번부터 최대 기존 queue1 길이의 2배만큼, qPointer2는 큐 길이에 해당하는 인덱스 부터  큐 길이에 해당하는 인덱스 * 2까지 갈 수 있으므로 최대 큐 길이 * 3만큼 이동할 수 있어, 이동 횟수의 최대값은 큐 길이 * 3이 된다.

const solution = (queue1, queue2) => {
  const newQ = [...queue1, ...queue2];
  let sum1 = queue1.reduce((prev, cur) => prev + cur, 0);
  let sum2 = queue2.reduce((prev, cur) => prev + cur, 0);
  const half = (sum1 + sum2) / 2;
  let q1P = 0;
  let q2P = queue1.length;

  for (let cnt = 0; cnt < queue1.length * 3; cnt++) {
    if (sum1 === half) {
      return cnt;
    }
    sum1 = sum1 > half ? 
           sum1 - newQ[q1P++ % newQ.length] : sum1 + newQ[q2P++ % newQ.length];
  }

  return -1;
};

 

이해에 도움이 된 블로그)

https://koguri.tistory.com/108

 

[프로그래머스] 두 큐 합 같게 만들기(javascript)

문제 설명 길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때

koguri.tistory.com

 

복기

6/23
반응형