https://www.acmicpc.net/problem/2003
2003번: 수들의 합 2
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
www.acmicpc.net
투 포인터 알고리즘의 기본적인 문제라고 할 수 있다.
어떻게 보면 이중 반복문을 사용하여 쉽게 풀 수도 있지만 이는 시간 초과가 날 확률이 높으므로 우린 투 포인터 알고리즘 개념을 사용할 것이다.
투 포인터 알고리즘 개념이 익숙치 않다면- https://yhoons.tistory.com/6
투포인터 알고리즘(Two Pointers Algorithm) - c++
투포인터 알고리즘이란? 두 개의 포인터를 각각 이동시키면서 1차원 배열 안 특정 조건에 해당하는 값을 구하는 알고리즘이다. 알고리즘의 이해 1차원 배열이 있고, 합이 5인 연속적인 부분 수열
yhoons.tistory.com
이 문제는 투포인터 알고리즘 개념을 안다면 쉽게 풀 수 있는 문제이다.
#include<iostream>
#define maximum 100001
using namespace std;
int main() {
int N, M; //N:수열의 개수, M:연속적인 부분 수열의 합 조건
int count=0, sum=0; //count: 합M을 만족하는 부분 수열의 개수, sum:합을 저장하는 변수
int start, end; //투포인터
int a[maximum] = {0,}; //수열을 저장하는 배열 a
cin >> N >> M;
for(int i=0; i<N; i++) {
cin >> a[i];
}
start=end=0; //start와 end를 인덱스 0으로 가르키도록 초기화
for(;end<=N;) { //end포인터가 인덱스 끝까지 도달할 때까지 반복
if(sum > M) //연속적인 부분 수열 합이 요구 합 보다 클 때
sum -= a[start++]; //start포인터가 오른쪽으로 이동하기 전 가르켰던 곳에 있는 값을 빼주고 오른쪽으로 이동
else if(sum < M)
sum += a[end++];
else {
count ++;
sum += a[end++];
}
}
cout << count;
}
반응형
'Baekjoon > cpp' 카테고리의 다른 글
1697번 - 숨바꼭질 C++ (0) | 2023.07.09 |
---|---|
2178번 - 미로 탐색 C++ (0) | 2023.07.07 |
19532번 - 수학은 비대면강의입니다 C++ (0) | 2023.07.03 |
1504번 - 특정한 최단 경로 (0) | 2022.06.29 |
2193번- 이친수 (0) | 2022.05.03 |