넘치게 채우기

[프로그래머스] 연속된 부분 수열의 합 본문

PS/Programmers

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

riveroverflow 2023. 10. 15. 14:12
728x90
반응형

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 유형 : 투 포인터 / 부분합 / 브루트 포스

문제 난이도 : Level 2

 

문제 설명

비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.

  • 기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.
  • 부분 수열의 합은 k입니다.
  • 합이 k인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.
  • 길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.

수열을 나타내는 정수 배열 sequence와 부분 수열의 합을 나타내는 정수 k가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.


제한사항
  • 5 ≤ sequence의 길이 ≤ 1,000,000
    • 1 ≤ sequence의 원소 ≤ 1,000
    • sequence는 비내림차순으로 정렬되어 있습니다.
  • 5 ≤ k ≤ 1,000,000,000
    • k는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.

 

풀이

left = 0; right = 0부터 시작한다.

right포인터를 오른쪽으로 옮겨가면서 수를 누적시킨다.

합이 k보다 커지면, left 포인터를 오른쪽으로 옮겨서 수의 누적을 줄인다.

같으면, 경우의 수를 담는 배열에 담는다.

그 다음, right를 계속 누적시켜본다.

 

그리고, 정렬을 통해서 최소한의 수로 k를 만드는 부분배열, 같은 개수면 더 앞의 인덱스의 부분배열을 경우의 수들 중 맨 앞으로 가져온다.

경우의 수들을 담는 배열 중 맨 처음 경우의 수를 리턴한다.

 

코드

C++

#include <bits/stdc++.h>
using namespace std;

vector<int> solution(vector<int> sequence, int k) {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    vector<vector<int>> answer;
    const int n = sequence.size();
    int left = 0;
    int right = 0;
    int currentSum = 0;
    
    while (right < n) {
        currentSum += sequence[right];
        
        while (currentSum > k && left <= right) {
            currentSum -= sequence[left];
            left++;
        }
        
        if (currentSum == k) {
            answer.push_back({left, right});
        }
        right++;
    }
    
    sort(answer.begin(), answer.end(), [](const auto &a, const auto &b) {
        if(a[1]-a[0] == b[1]-b[0]) {
            return a[0] < b[0];
        }
        return a[1]-a[0] < b[1]-b[0];
    });
    
    return answer[0];
}
728x90
반응형