프로그래머스 알고리즘/Java

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

리버🐦‍🔥 2025. 5. 13. 20:00

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

⭐️ 중요 포인트

1. 일단 3중 포문을 사용해서 완탐으로 문제를 해결할 수 있다.

2. 그러나 완탐으로 해결하게 되면 중복된 경우(startIdx가 0부터 시작해서 len이 1, 2, 3, ..., n까지라고 할 때 (1), (1+2), (1+2+3), ... 처럼)가 계산된다.

3. 문제는 해결되지만 좀 더 빠른 방법으로 구현하기 위해서 elements의 길이만큼 cache를 선언하여 누적합을 구해 set에 넣으면 중복을 줄일 수 있다.

(0번째 인덱스에는 7부터 시작하는 누적합, 1번째 인덱스에는 9부터 시작하는 누적합을 구하며 len까지 누적하여 set에 넣으면 2중 for문안에 문제를 해결할 수 있고, set을 통해 누적합의 중복을 방지할 수 있다.)

 

 

<DP 해결>

import java.util.*;

class Solution {
    
    static int[] elements;
    static int answer;
    
    static Set<Integer> hash;
    static int[] cache;
    
    void init(int[] elements) {
        this.elements = elements;
        this.answer = 0;
        
        hash = new HashSet<>();
        cache = new int[elements.length];
    }
    
    void solve() {
        
        for (int len = 1; len <= elements.length; len++) {
            for (int idx = 0; idx < elements.length; idx++) {
                cache[idx] += elements[(idx + len - 1) % elements.length];
                hash.add(cache[idx]);
            }
        }
        
        answer = hash.size();
    }
    
    
    public int solution(int[] elements) {
        init(elements);
        solve();
        return answer;
    }
}

 

<완탐 해결>

import java.util.*;

class Solution {
    
    static int[] elements;
    static int answer;
    
    static Set<Integer> hash;
    
    void init(int[] elements) {
        this.elements = elements;
        this.answer = 0;
        
        hash = new HashSet<>();
    }
    
    void solve() {
        
        for (int cnt = 1; cnt <= elements.length; cnt++) {
            for (int startIdx = 0; startIdx < elements.length; startIdx++) {
                int sum = 0;
                for (int idx = startIdx; idx < startIdx + cnt; idx++) {
                    sum += elements[(idx) % elements.length];
                }
                hash.add(sum);
            }
        }
        
        answer = hash.size();
    }
    
    
    public int solution(int[] elements) {
        init(elements);
        solve();
        return answer;
    }
}