프로그래머스 연속 부분 수열 합의 개수 JavaScript
2023년 1월 8일
문제 풀이
이 문제는 처음과 끝이 연결되어 끊기는 부분이 없는 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 개 인지 찾는 문제이다.
이때 중복되는 값을 저장하지 않기 위해 자료구조 Set 을 이용해 연속 부분 수열들의 합을 중복 없이 구해준다. new Set()
예를 들어 길이가 4인 매개 변수 elements 가 주어졌을 때 길이가 3인 연속 부분 수열 중 인덱스 (3, 0, 1)의 합을 구하는 방법으로는
- 인덱스를 elements 의 길이와 나누어 나온 나머지를 이용하는 방법 (3, 4, 5) => (3%4 = 3, 4%4 = 0, 5%4 =1)
- 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;
}