Level2 - 두 큐 합 같게 만들기

손대중·2022년 8월 24일
0

문제 설명 및 링크

https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=javascript

나의 풀이

일단 안되는 조건부터 제거하자.

아래 두 경우는 죽었다 깨도 두 큐의 합이 같을 수가 없는 조건들이다.

  • 전체 array 합이 홀수인 경우
  • 전체 array 에서 가장 높은 수가 목표보다 큰 경우

한 큐에 shift 한 경우 나머지 큐에 pop 을 하는 동작이므로, 나는 두 큐 - queue1, queue2 를 하나로 합친 array 라고 생각하고, 합친 array 안에서 조건에 맞는 영역을 찾는 문제라고 생각함.

아래 이미지와 같은 느낌....

image.png

영역 찾는 로직은 아래와 같다.

참고로 전체 array 는 시작 부분과 끝 부분이 이어져 있다고 생각하고, 시작 위치 혹은 종료 위치가 array length 보다 커질 경우 0 으로 설정하는 예외처리가 추가됨. (자세한 건 코드 참조하삼)

  • 현재 영역의 합이 목표 합보다 크다면
    • 영역의 종료 위치 증가
  • 현재 영역의 합이 목표 합보다 작다면
    • 영역의 시작 위치 증가
      • 증가된 시작 위치가 0 이 되었다면, 루프를 한바퀴 돌았다는 뜻 --> 이는 조건에 맞는 영역이 없다는 뜻 --> 종료
  • 현재 영역의 합이 목표 합보다 크다면

다른 사람 풀이 보니 더 간단히 푼 사람들이 많더라 ㅜㅜ 역시 똑똑한 사람들 많어

코드

모든 프로그래머스 문제 관련 코드들은 GitHub 링크 에 있음.

function solution(queue1, queue2) {
   const allQueue = [...queue1, ...queue2];
   
   let maxNum = 0;
   let currentNum = 0;
   
   const goalNum = allQueue.reduce((acc, cur, index) => {
       if (cur > maxNum) {
           maxNum = cur;
       }
       
       if (index < queue1.length) {
           currentNum += cur;
       }
       
       return acc + cur;
   }, 0) / 2;
   
   // 전체 합이 홀수인 경우, array 에서 최고 높은 수가 목표 합보다 큰 경우
   // 요 경우는 두 큐의 합이 같을 수가 없음
   if (!Number.isInteger(goalNum) || maxNum > goalNum) {
       return -1;
   }
   
   // queue1, queue2 를 합친 array 에서 조건에 맞는 영역 - 합이 goalNum 인 영역을 찾는단 느낌으로...
   // queue1 영역부터 시작
   let startIndex = 0;
   let lastIndex = queue1.length - 1;
   let count = 0;
   
   while (currentNum !== goalNum) {
       while (currentNum < goalNum) {
           lastIndex++;
           if (lastIndex > allQueue.length - 1) {
               lastIndex = 0;
           }
           
           currentNum += allQueue[lastIndex];
           
           count++;
       }
       
       while (currentNum > goalNum) {
           currentNum -= allQueue[startIndex];
           
           startIndex++;
           // 전체 array 를 한바퀴 돌았으면, 합이 goalNum 인 영역이 없다는 뜻이므로 -1 return
           if (startIndex > allQueue.length - 1) {
               return -1;
           }
           
           count++;
       }
   }
   
   return count;
}

0개의 댓글