https://school.programmers.co.kr/learn/courses/30/lessons/118667?language=javascript
일단 안되는 조건부터 제거하자.
아래 두 경우는 죽었다 깨도 두 큐의 합이 같을 수가 없는 조건들이다.
한 큐에 shift 한 경우 나머지 큐에 pop 을 하는 동작이므로, 나는 두 큐 - queue1, queue2 를 하나로 합친 array 라고 생각하고, 합친 array 안에서 조건에 맞는 영역을 찾는 문제라고 생각함.
아래 이미지와 같은 느낌....
영역 찾는 로직은 아래와 같다.
참고로 전체 array 는 시작 부분과 끝 부분이 이어져 있다고 생각하고, 시작 위치 혹은 종료 위치가 array length 보다 커질 경우 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;
}