[BOJ] 1806. 부분합(javascript)

레몬커드요거트·2026년 4월 14일

코딩테스트준비

목록 보기
37/66
post-thumbnail

실패코드

let endIdx = N;
let startIdx = 0;

function findPartialSum(target) {
  while (startIdx <= endIdx) {
    let partialSum = prefixSum[endIdx] - prefixSum[startIdx];

    if (target == partialSum) {
      let length = endIdx - startIdx;

      return length;
    } else if (target < partialSum) {
      endIdx -= 1;
    } else if (target > partialSum) {
      startIdx += 1;
    }
  }

  return 0;
}

console.log(findPartialSum(S));
console.log(prefixSum);

실패원인

  1. 부분합이 나올 수 있는 최소길이어야하는데, 길이를 비교하는 로직이 없음
  2. 부분합을 키울 방법이 없다
    • endIdx를 줄이면(-1): 전체 합이 감소
    • startIdx를 늘리면(+1): 앞부분을 깎아내는 것이므로 전체 합이 감소

성공코드

let minLength = Infinity;
let startIdx = 0;
let endIdx = 0;
let currentSum = 0;

while (endIdx <= N) {
  if (currentSum >= S) {
    minLength = Math.min(minLength, endIdx - startIdx);
    currentSum -= numList[startIdx];
    startIdx++;
  } else {
    if (endIdx == N) break;
    currentSum += numList[endIdx];
    endIdx++;
  }
}

console.log(minLength === Infinity ? 0 : minLength);

console.log(prefixSum);

최소길이를 구할 때 사용하면 좋은 패턴

let minLength = Infinity;

파이썬에서는…

min_length = float('inf')
import math

min_length = math.inf
profile
비요뜨 최고~

0개의 댓글