본문 바로가기
코딩 테스트 (C#)/프로그래머스 (Lv2)

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

by 스누누피 2025. 2. 10.

프로그래머스 > 코딩테스트 연습 > 연습문제 >  연속 부분 수열 합의 개수

https://school.programmers.co.kr/learn/courses/30/lessons/131701

 

📒 문제

철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.

원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

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

 

입출력 예

elements result
[7,9,1,1,4] 18

 

입출력 예 설명

 

입출력 예 #1

  • 길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
    길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
    길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
    길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
    길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
    이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
    [1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]

💻 소스코드

using System;
using System.Collections.Generic;
using System.Linq;

public class Solution {
    public int solution(int[] elements) {
        int answer = 0;
        
        int[] elements_x2 = elements.Concat(elements).ToArray();
        
        // 누적합
        int[] prefix_sum = new int[elements_x2.Length];
        prefix_sum[0] = elements_x2[0];
        for(int i = 1; i < prefix_sum.Length; i++)
        {
            prefix_sum[i] = prefix_sum[i - 1] + elements_x2[i];
        }

        HashSet<int> set = new HashSet<int>();
        for(int len = 1; len < elements.Length+1; len++) // len
        {
            for(int i = 0; i < elements.Length; i++)
            {
                int part_sum = prefix_sum[i + len] - prefix_sum[i];
                set.Add(part_sum);
            }
        }

        answer = set.Count;
        return answer;
    }
}

 

📝 풀이

해당 문제는 누적합과 중복이 없는 set 자료형을 이용해서 해결하였다.

 

원형 수열이기 때문에 elements를 두번 열결시켜 elements_x2를 만들어 주고, 이를 사용해 누적합 prefix_sum을 구해준다.

 

누적합을 이용하면 구간합을 구할수있기때문에 구간합 part_sum을 구해 set 자료형에 넣어주면 중복되는 결과는 알아서 걸러준다.

 

구해준다음 set의 길이를 구하면 원형 수열의 연속하는 부분 수열의 합이 몇개인지 알수있다.


관련 포스팅

 

[알고리즘] 누적합 (Prefix Sum)

누적합(Prefix Sum)은 배열 또는 리스트 등에서 일정 구간의 합을 빠르게 계산하기 위한 방법이면서 동적 계획법(DP)의 형태 중 하나이다.기본적인 방식은 각 요소까지의 누적합을 계산하여 이를 배

twd0622.tistory.com