문제는 다음과 같다.
https://www.acmicpc.net/problem/22862
풀이는 다음과 같다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
StringTokenizer st1 = new StringTokenizer(br.readLine());
for(int i = 0 ; i < N ; i++) {
arr[i] = Integer.parseInt(st1.nextToken());
}
int s = 0;
int e = 0;
int odd = 0;
int answer = 0;
while(e < N) {
if(odd < K) { //홀수 개수 K 보다 적을때
if(arr[e]%2 == 1)odd++;
e++; //한칸더감
answer = Math.max(answer, e-s-odd);
}
else if(arr[e]%2 == 0) { //홀수개수 K개 이상이면서 지금 e 짝수
e++;
answer = Math.max(answer, e-s-odd);
}
else { // K개 이상, 지금 e 홀수
if(arr[s]%2 == 1) {
odd--;
}
s++;
}
}
bw.write(String.valueOf(answer));
bw.flush();
bw.close();
}
}
적당한 투포인터 문제이다.
풀이를 설명하자면,
부분수열에 odd, 홀수의 개수가 K개보다 작다면 수열을 늘릴 수 있으므로
e index의 값에 따라 홀수 개수 늘려주고
e값 증가, 정답 갱신을 해준다.
if(odd < K) { //홀수 개수 K 보다 적을때
if(arr[e]%2 == 1)odd++;
e++; //한칸더감
answer = Math.max(answer, e-s-odd);
}
그다음,
else if문은, 홀수가 K개 이상일때는 수열에 들어올 값으로 설정해준다.
들어올 값이 홀수가 아니라면 (짝수라면) 계속 수열을 늘릴 수 있으므로 진행시킨다
else if(arr[e]%2 == 0) { //홀수개수 K개 이상이면서 지금 e 짝수
e++;
answer = Math.max(answer, e-s-odd);
}
들어올 값이 홀수라면 수열을 늘릴 수 없으니 수열을 줄여준다.
else { // K개 이상, 지금 e 홀수
if(arr[s]%2 == 1) {
odd--;
}
s++;
}