알고리즘/프로그래머스

연속 부분 수열 합의 개수

yoney 2025. 2. 6. 21:46

문제 설명

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

 

원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.

원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.


import java.util.HashSet;

class Solution {
    public int solution(int[] elements) {
        HashSet<Integer> set = new HashSet<>();
        int start = 1;
        while (start < elements.length) {
            for (int i = 0; i < elements.length; i++) {
                int sum = 0;
                for (int j = i; j < i + start; j++) {
                    sum += elements[j % elements.length];
                }
                set.add(sum);
            }
            start++;
        }
        return set.size() + 1;
    }
}

풀이

  • start 변수: 부분 수열의 길이를 나타내기 위한 변수. 1부터 elements.length-1까지 올라간다.
  • int i로 돌아가는 for 루프: i가 부분 수열이 시작하는 인덱스를 나타낸다.
  • int j로 돌아가는 for 루프: j는 부분 수열의 범위를 나타내고 곧 부분 수열의 길이가 된다.
  • elements의 인덱스에서 j%elements.length를 하면 배열을 초과했을 때 다시 처음으로 돌아오도록 할 수 있다.
  • set.size()에서 +1을 한 이유는 부분 수열의 길이가 elements.length랑 같은 경우(즉 모든 값을 다 더한 값)가 1개 있기 때문에 추가해서 반환한다.