코딩 테스트

(Java) 프로그래머스 - 연속 부분 수열 합의 개수

로승리 2023. 4. 28. 17:29

처음에는 단순히 슬라이딩 윈도우를 사용해서 풀려고 시도했다.

그러나 부분 수열의 크기가 고정되어 있지 않아서 풀이에 많은 시간이 걸렸다.

 


최종 코드

import java.util.*;
class Solution {
    public int solution(int[] elements) {
        int answer = 0;
        
        // 부분 수열 크기
        int size = 1;
        Set<Integer> set = new HashSet<>();
        
        // 부분 수열 크기가 elements 길이가 될때까지 반복
        while (size <= elements.length) {
            int sum = 0;
            // 부분 수열의 시작을 set에 추가
            for (int i = 0; i < size; i++) {
                sum += elements[i % elements.length];
                set.add(sum);
            }
            // 시작 인덱스부터 elements 끝까지 한칸씩 밀며 진행 
            for (int i = 0; i < elements.length; i++) {
                sum -= elements[i % elements.length];
                sum += elements[(i + size) % elements.length];
                set.add(sum);
            }
            size++;
        }
        answer = set.size();
        return answer;
    }
}