Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[프로그래머스] 연속된 부분 수열의 합 본문
728x90
반응형
https://school.programmers.co.kr/learn/courses/30/lessons/178870
문제 유형 : 투 포인터 / 부분합 / 브루트 포스
문제 난이도 : 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
반응형
'PS > Programmers' 카테고리의 다른 글
[프로그래머스] 당구 연습 (0) | 2023.10.17 |
---|---|
[프로그래머스] 카카오프렌즈 컬러링북 (0) | 2023.10.16 |
[프로그래머스] 수식 최대화 (0) | 2023.10.12 |
[프로그래머스] 2 x n 타일링 (0) | 2023.10.11 |
[프로그래머스] 체육복 (0) | 2023.10.11 |