가장 긴 짝수 연속한 부분 수열 (small)

Huisu·2023년 12월 5일
0

Coding Test Practice

목록 보기
78/119
post-thumbnail

문제

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 83

아이디어

투포인터 → 하나는 진행하고 하나는 리셋하는 형식

제출 코드

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();
    }
}

0개의 댓글