프로그래머스 연속 부분 수열 합의 개수 JavaScript

2023년 1월 8일

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

문제 풀이

이 문제는 처음과 끝이 연결되어 끊기는 부분이 없는 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 개 인지 찾는 문제이다.
이때 중복되는 값을 저장하지 않기 위해 자료구조 Set 을 이용해 연속 부분 수열들의 합을 중복 없이 구해준다. new Set()
예를 들어 길이가 4인 매개 변수 elements 가 주어졌을 때 길이가 3인 연속 부분 수열 중 인덱스 (3, 0, 1)의 합을 구하는 방법으로는

  1. 인덱스를 elements 의 길이와 나누어 나온 나머지를 이용하는 방법 (3, 4, 5) => (3%4 = 3, 4%4 = 0, 5%4 =1)
  2. elements 를 두개로 합쳐 인덱스(3, 4(=elements[0]), 5(=elements[1]))을 이용하는 방법

생각나는 2가지 방법 중 좀 더 간단한 2번째 방법을 이용하기 위해 circle = elements * 2 을 선언해 준다.
i = 길이가 i인 수열을 구하기 위해, j = 연속 부분 수열의 시작점을 구하기 위해 i, j의 이중 for 문을 돌며 circle 의 인덱스 j 부터 j+i-1 까지의 배열을 slice()하고 reduce()를 이용해 전부 더해준다.
(함수 slice()는 begin, end를 매개변수를 받는데 begin부터 end를 제외한 end-1까지의 부분을 잘라서 리턴한다. end가 생략되면 배열의 끝까지 추출한다.)
SumLengthI = 길이가 i인 j부터 j+i-1까지의 연속 부분 수열의 합을 set에 add 한다.
길이가 elements 인 연속 부분 수열의 합은 반드시 하나이기에 마지막에 더해준다.

solution.js
function solution(elements) {
    let answer = 0;
    const circle = elements.concat(elements);
    const mySet = new Set();
    for (let i = 1; i < elements.length; i++) {
        for (let j = 0; j < elements.length; j++) {
            const SumlengthI = circle.slice(j, j+i).reduce((acc, cur) => {
                return acc+=cur;
            }, 0);
            mySet.add(SumlengthI);
        }
    }
    answer = mySet.size+1;
    return answer;
}

댓글