백준 algorithm
백준 2003 수들의 합 2 C++
cosmohoo
2021. 11. 2. 23:03
반응형
=> 투포인터의 기본개념을 묻는 문제입니다.
=> while문을 통해 시간 복잡도 O(N)의 속도를 이끌어낼 수 있는 알고리즘입니다.
https://codingham.tistory.com/232
백준 1806 - 부분합
=> 투 포인터 알고리즘의 개념을 알면 풀 수 있는 문제입니다. (저도 이 문제를 풀면서 처음으로 해당 알고리즘을 들었습니다.) => start 점과 end 점의 위치를 변환해가며 S의 값을 넘으면 가장 적은
codingham.tistory.com
위 문제는 투포인터를 활용한 문제입니다.
해당 문제를 푼 후에 해당 문제를 풀어보는 것도 좋은 방법입니다.
=> arr[0] 부문에 값을 미리 넣어 계속 틀렸었습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int arr[10001];
int N,M;
cin >> N >> M;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
int start=0, end=0,cnt =0;
int sum = arr[0];
while(start <= end && end < N )
{
if (sum < M) // 아직 부분합이 S를 만족하지 못하는 경우
{
sum += arr[++end];
}
else if ( sum == M)//원하는 값을 찾았을 경우
{
cnt++;
sum += arr[++end];
}
else if ( sum > M)//원하는 값보다 큰 경우
{
sum -= arr[start++];
if(start > end)
{
end = start;
sum = arr[start];
}
}
}
cout <<cnt<<'\n';
return 0;
}
반응형