https://www.acmicpc.net/problem/22862
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let [n, k] = input[0].split(" ").map(Number);
let nums = input[1].split(" ").map(Number);
let left = (cnt = ans = 0);
for (let right = 0; right < n; right++) {
if (nums[right] % 2 === 1) {
cnt++;
}
while (cnt > k) {
if (nums[left] % 2 === 1) cnt--;
left++;
}
if (cnt <= k) ans = Math.max(ans, right - left - cnt + 1);
}
console.log(ans);
✔ 알고리즘 : 투포인터
✔ 홀수인 경우가 k개이하로 포함되도록 하는 부분수열의 최대길이를 구하는 문제이다
✔ 두개의 포인터를 0에서부터 시작하면서 투포인터 탐색을 한다
✔ right포인터 인덱스가 홀수인경우 cnt를 더해주고 while문에서 left를 당겨준다. left포인터 인덱스가 홀수인경우 cnt를 빼준다
✔ ans에 넣을때는 cnt가 k보다 작거나 같아야하며 짝수의 개수를 구해야 하므로 홀수의 개수인 cnt를 빼준다
✔ 난이도 : 백준 기준 실버 1