문제 풀이/문제 풀이(프로그래머스)

연속된 부분 수열의 합

풀뿌리 2025. 4. 4. 11:19

문제 위치 : https://school.programmers.co.kr/learn/courses/30/lessons/178870

 

프로그래머스

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

programmers.co.kr

 

윈도우 슬라이딩으로 푸는 문제이다.

초기화 되었을 때는 이런 상태로 되어있다.

 

이 상태에서 RIGHT위치의 값을 SUM에 더한다.

 

만약, SUM이 이보다 작다면? 비내림차순 정렬이므로 다음 값을 윈도우에 포함시켜준다. 그러면 아래와 같은 모양이 된다.

 

 

이 상태에서 여전히 임의의 정수 N이 k보다 작다면 위 과정을 반복한다.

 

 

그러다보면 아래 그림과 같이 k값을 넘게 된다.

 

그럴 때는 이렇게 LEFT를 한 칸 증가시켜 윈도우 내부의 값을 줄인다.

상기의 과정을 반복하며 조건을 만족하는 윈도우 중 지금까지 등록된 가장 짧은 윈도위의 LEFT와 RIGHT를 기록하게 해두었다 출력하도록 구현하면 된다.

#include <vector>

using namespace std;

vector<int> solution(vector<int> sequence, int k) {
    vector<int> answer(2, 0);
    int left = 0, right = 0, sum = 0;
    int min_len = sequence.size() + 1;  // 가능한 부분 수열의 길이보다 큰 값으로 초기화

    while (right < sequence.size()) {
        sum += sequence[right];
        
        while (sum > k && left <= right) {
            sum -= sequence[left];
            left++;
        }

        if (sum == k && (right - left + 1) < min_len) {
            answer[0] = left;
            answer[1] = right;
            min_len = right - left + 1;
        }

        right++;
    }


    return answer;
}