[JS]프로그래머스 연속 부분 수열 합의 개수

DARTZ·2023년 6월 3일
0

알고리즘

목록 보기
115/135
function solution(elements) {
    const haps = new Set();
    const len = elements.length;

    for (let i = 1; i <= len; i++) {
        let sum = 0;
        for (let j = 0; j < len; j++) {
            if (j===0) {
                for (let k = 0; k < i; k++) {
                    sum += elements[k];
                };
            } else {
                sum -= elements[j-1];
                sum += elements[(j+i-1)%len];
            }
            haps.add(sum);
        };
    };

    return haps.size;
}

문제의 아이디어를 떠올리긴 했습니다. 하지만 그게 슬라이딩 윈도우 알고리즘이라는 것을 몰랐고 코드로 구현하는게 어려웠습니다.
참고 블로그

슬라이딩 윈도우 알고리즘

구간의 넓이가 고정되어 있을 때, 구간 합을 구하는 알고리즘

처음의 구간에서만 합을 구하고 한칸씩 밀면서 처음 더한 값을 빼주고 다음 값을 더해주는 방법입니다.

            if (j===0) {
                for (let k = 0; k < i; k++) {
                    sum += elements[k];
                };
            }

위 부분이 처음 구간 합을 구하는 코드입니다. 각 구간 (1개일 때, 2개일 때...등등) 첫 구간합일 때 if (j===0)일 때만 범위의 합을 구해주고 다음부터는 이 구간 합을 가지고 다음을 구하면 됩니다.

else {
                sum -= elements[j-1];
                sum += elements[(j+i-1)%len];
            }

위 부분이 다음 구간합을 구하는 코드입니다. 이전 값을 빼주고 배열의 다음 값을 더해주면 됩니다. len(배열의 길이)로 나눠주는 이유는 문제가 순환이기 때문입니다. j+i-1에서 1을 빼주는 이유는 배열은 0부터 시작하기 때문입니다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글