22862 가장 긴 짝수 연속한 부분 수열 (large) 자바

꾸준하게 달리기~·2023년 8월 4일
0
post-thumbnail

문제는 다음과 같다.
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++;
            }
profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글