[CDT - Javascript] 프로그래머스 연습문제 @ 연속 부분 수열 합의 개수

김현수·2024년 1월 27일
0

cdt

목록 보기
40/51


🖋️ 연속 부분 수열 합의 개수


# 문제 설명

수열을 가지고 놀기

어떤 자연수로 이루어진
원형 수열의 연속하는 부분 수열의 합으로
만들 수 있는 수가 모두 몇 가지인지 알아보기

  • 조건

    • 원형 수열이란 일반적인 수열에서
      처음과 끝이 연결된 형태의 수열
    • 원형 수열은 처음과 끝이 연결되어 끊기는 부분이
      없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많음
  • 매개 변수

    • 원형 수열의 모든 원소 elements
  • 반환값

    • 원형 수열의 연속 부분 수열 합으로
      만들 수 있는 수의 개수를 return

  • 📢 제한사항

    • 3 ≤ elements의 길이 ≤ 1,000
    • 1 ≤ elements의 원소 ≤ 1,000

  • 📰 입출력 예시

    elementsresult
    [7,9,1,1,4]18



  • 나의 CODE

function solution(elements) {
    let answer = [];
    const size = elements.length;
    
    for (let len = 1; len <= size; len++) {
        for (let i = 0; i < size; i++) {
            const arr = elements.slice(i, i+len);
            if (arr.length < len) {
                elements.slice(0,len - arr.length).forEach((v) => arr.push(v));
            }
            const sum = arr.reduce((acc,cur,self) => acc+cur, 0);
            answer.push(sum)
        }
    }
    
    const no_repeat = new Set(answer);
    
    return [...no_repeat].length;
}

  • 더 좋은 CODE

function solution(elements) {
    const circular = elements.concat(elements);
    const set = new Set();
    for (let i = 0; i < elements.length; i++) {
        let sum = 0;
        for (let j = 0; j < elements.length; j++) {
            sum += circular[i + j];
            set.add(sum);
        }
    }
    return set.size;
}

풀이

  • set 과 배열을 통해 solution 구하기

  • 배열 각 길이만큼 누적 더하기
  • 부족한 길이만큼 시작 인덱스부터 더하기 (원형 수열)
  • set 으로 중복 없애기
profile
일단 한다

0개의 댓글