문제 출처
1. 문제설명
- 길이가
N
인 수열에서 원하는 위치의 홀수를 K
번 삭제할 수 있다.
- 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 구하라
2. 알고리즘 설계
- 투 포인터를 응용해 풀 수 있다.
left
, right
를 0부터 시작한다.
- 짝수면 정답값을 갱신해준다.
- index 끼리 빼주고 1을 더해야 개수가 된다.
- 여기서 k를 사용한 횟수를 빼면 짝수의 개수가 된다.
- 아니라면,
K
를 1회 사용한다.
- 만약
K
를 전부 사용했으면 left
를 1 올려주는데
- left 위치의 원소가 홀수라면
K
사용횟수를 하나 뺀다.
3. 전체 코드
#include <bits/stdc++.h>
using namespace std;
int n, k, arr[1000005];
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k;
for(int i=0; i<n; i++)
cin >> arr[i];
int left=0, right=0, tmp=0, ans=0;
while(left <= right && right < n) {
int cur = arr[right];
if(cur % 2 != 0) {
if(tmp < k) tmp++;
else {
if(arr[left++] % 2 != 0) tmp--;
right--;
}
}
else ans = max(ans, right-left+1-tmp);
right++;
}
cout << ans;
return 0;
}