Algorithm/Programmers

178870. 연속된 부분 수열의 합

사랑우주인 2025. 4. 1. 21:24

문제

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

제한사항

풀이

class Solution {
    public int[] solution(int[] sequence, int k) {
        int[] answer = new int[2];
        int n = sequence.length;
        
        answer[0] = 0; answer[1] = n-1;
        
        int left =0;
        
        int sum = 0;
        
        for(int right = 0; right < n ; right ++ ) {
            sum+=sequence[right];
            
            while(sum > k && left < right) {
                sum-=sequence[left];
                left++;
                
            }
            
            if(sum == k) {
                // 부분 수열 길이 비교
                if((right-left+1) < (answer[1] -answer[0] +1)) {
                    answer[0] = left;
                    answer[1] = right;
                }
            }
        }
        return answer;
    }
}

회고

부분 수열 합이 k가 되는 수열 중 길이가 짧은 부분 수열의 양 끝 인덱스를 구하는 문제였다. 단순 이중 for문을 통해 부분 수열의 합이 k와 일치하는지 계산해볼 수 있지만, 제한사항에 따라 시간 초과가 발생한다. 그래서 투 포인터 알고리즘를 이용해 부분 수열을 찾았다. 수열이 정렬되어 있다면 투 포인터 알고리즘 시간 복잡도는 O(N)이다.