22857번: 가장 긴 짝수 연속한 부분 수열 (small)
길이가 N인 수열 S가 있다. 수열 S는 1 이상인 정수로 이루어져 있다.
수열 S에서 원하는 위치에 있는 수를 골라 최대 K번 삭제를 할 수 있다.
예를 들어, 수열 S가 다음과 같이 구성되어 있다고 가정하자.
수열 S : 1 2 3 4 5 6 7 8
수열 S에서 4번째에 있는 4를 지운다고 하면 아래와 같다.
수열 S : 1 2 3 5 6 7 8
수열 S에서 최대 K번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 구해보자.
수열 S의 길이 N와 삭제할 수 있는 최대 횟수인 K가 공백으로 구분되어 주어진다.
두 번째 줄에는 수열 S를 구성하고 있는 N개의 수가 공백으로 구분되어 주어진다.
입력 | 출력 |
---|---|
8 2 | |
1 2 3 4 5 6 7 8 | 3 |
투포인터 → 하나는 진행하고 하나는 리셋하는 형식
import java.io.IOException;
import java.util.Scanner;
public class two22857 {
public void solution() throws IOException {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] numbers = new int[n];
for (int i = 0; i < n; i++) {
numbers[i] = sc.nextInt();
}
int rightPoint = 0, leftPoint = 0;
int odd = 0, even = 0;
if (numbers[0] % 2 == 0) even++;
else odd++;
int result = even;
while (rightPoint >= leftPoint) {
if (odd > k) {
if (numbers[leftPoint] % 2 == 0) even--;
else odd--;
leftPoint++;
} else {
rightPoint++;
if (rightPoint >= n) break;
if (numbers[rightPoint] % 2 == 0) even++;
else odd++;
result = Math.max(result, even);
}
}
System.out.println(result);
}
public static void main(String[] args) throws IOException {
new two22857().solution();
}
}