반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

프로그래머스) 두 큐 합 같게 만들기(투포인터) JS 본문

코딩테스트 with JS/백준, 프로그래머스

프로그래머스) 두 큐 합 같게 만들기(투포인터) JS

5_hyun 2022. 12. 12. 00:11

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

 

프로그래머스

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

programmers.co.kr

문제 해결 방법

이 문제를 js로 해결하기 위해서는 투포인터로 풀어야한다. 카카오에서 c++로 풀이를 제공했는데, 이 방식대로 문제를 풀면 js에서는 시간 초과가 떴다.

코드

function add(ary) {
  return ary.reduce((a, b) => a + b, 0);
}

function solution(queue1, queue2) {
  var answer = 0;
  let total = [...queue1, ...queue2];
  let start = 0;
  let end = queue1.length;

  let firstAry = add(total.slice(start, end));
  let goal = add(total) / 2;

  while (answer < total.length * 2 && firstAry !== goal) {
    if (firstAry < goal) {
      firstAry += total[end];
      end++;
    } else if (firstAry > goal) {
      firstAry -= total[start];
      start++;
    }
    answer++;
  }

  if (firstAry !== goal) answer = -1;

  return answer;
}

예시)

사진처럼 2개의 큐가 주어졌을 때를 예시로 문제 설명을 해보겠다.

 

1. queue1과 queue2를 합쳐준다.

위 사진처럼 total 배열에 queue1, queue2를 합쳐준다.

 

2. start, end, firstAry, goal 변수 값 할당

start는 0부터 시작하고 end는 queue1의 길이로 둔다.

firstAry에 queue1의 값들 합을 넣어준다.

goal에는 total의 전체 값의 합/2를 하여 넣어준다.

 

3. while문에서 start, end를 기반으로 비교

-queue1 < queue2인 경우

firstAry가 queue1의 합이므로 14이다. goal의 값은 15라서 queue2의 값이 queue1보다 크다.

따라서 queue2에서 값을 빼서 queue1에 넣어줘야한다. 그러므로 firstAry에 total[end]를 더해주고 end++를 한다.

while문이 돌아가는 한 answer는 계속 1씩 증가한다.

 

-queue1 > queue2인 경우

여기에서는 queue1값이 더 크기 때문에 queue1에서 값을 빼서 queue2에 넣어줘야한다. 

따라서 firstAry에서 total[start]를 빼주고 start++를 한다.

마찬가지로 while문이 돌아가는 한 answer는 계속 1씩 증가한다.

 

-queue1 === queue2인 경우 

두 배열의 합이 같아지면 while에 조건을 걸어 반복문이 멈추도록 한다.

 

4. while문이 끝나고 firstAry !== goal인 경우

answer를 -1로 바꿔준다.

728x90
반응형
Comments