해당 리스트의 연속 수열의 합이 특정 값보다 이상이 되는 것 중 가장 짧은 것의 길이를 확인하는 문제이다.
https://butter-shower.tistory.com/226
투포인터 알고리즘은 병합정렬에서 사용한 Conquer 방식과 유사하게 start와 end 지점에서의 부분합을 계산하는 알고리즘이다.
이 문제에서는 특정값 S의 이상이 되는 값들 중 가장 짧은 것을 구하라고 하였으니, 아래의 방법들로 소스코드를 구현한다.
(1) for문에서 start 변수를 기준으로 while 내부에서 end 값을 늘려주며 부분합을 계산한다.
(2) 부분합이 S 이상이 되는 경우에 기존에 구하였던 min 변수보다 작은 경우 min을 갱신하여준다.
(3) 부분합의 계산이 끝났을 때 다음 스텝으로 넘어가 부분합을 새롭게 계산해주기 위해 현재 start 위치의 값을 빼준다.
소스 코드
#include <iostream>
#define MAX 100000
using namespace std;
int main() {
int n; // 수열의 길이
int s; // 최소 숫자
cin >> n >> s;
int arr[MAX]; // 수열을 담을 배열
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int count = 0;
int sum = 0; // 현재 간격의 값들을 더한 값
int end = 0;
int min = 0; // 최솟값을 저장할 변수
for (int start = 0; start < n; start++) {
while (sum < s && end < n) { // 현재 부분합이 s보다 작고, 마지막 지점에 도달하지 않았으면
sum += arr[end];
end++;
}
if (sum >= s) { // 부분합이 s 이상인 경우
if (start == 0)
min = end - start;
else {
if (end - start < min)
min = end - start;
}
}
sum -= arr[start]; // 다음 위치를 탐색하기 위해 부분합에서 현재 위치의 값을 빼준다.
}
cout << min << endl;
return 0;
}
+) 출력 조건에 "만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다." 라고 나와있어서, min의 초기값을 0으로 설정해주지 않으면 런타임에러가 뜬다.
'Algorithm > Baekjoon' 카테고리의 다른 글
백준 1027 고층 건물 C++ #Math (0) | 2023.01.17 |
---|---|
백준 12847 꿀 아르바이트 C++ 풀이 (0) | 2022.11.09 |
백준 1003 피보나치 함수 C++ 구현 (0) | 2022.10.31 |
[BOJ]9934 : 완전 이진 트리 C++ 문제 풀이 (0) | 2021.11.04 |
[BOJ]10773 제로 : 스택과 큐 C++ 문제풀이 (0) | 2021.09.18 |