본문 바로가기

백준/슬라이딩윈도우

가장긴짝수연속합부분수열

728x90

https://www.acmicpc.net/problem/22862

 

22862번: 가장 긴 짝수 연속한 부분 수열 (large)

수열 $S$에서 최대 $K$번 원소를 삭제한 수열에서 짝수로 이루어져 있는 연속한 부분 수열 중 가장 긴 길이를 출력한다.

www.acmicpc.net

package BaekJoon.TwoPointer;

import java.util.*;
import java.io.*;

public class 가장긴짝수연속한부분수열 {

	
	static int n,k;
	static int[]arr;
	
	
	public static void main(String[] args) throws IOException{
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		n = Integer.parseInt(st.nextToken());
		k = Integer.parseInt(st.nextToken());
		arr = new int[n];
		
		st = new StringTokenizer(br.readLine());
		
		for(int i=0; i<n; i++ ) {
			
			arr[i]=Integer.parseInt(st.nextToken());
		}
		
		int p =0; //짝
		int q=0; //홀
		int answer =0;
		
		int s =0;
		int e =0;
		
        //슬라이딩 윈도우 -> 윈도우 크기만큼 end 길이을 늘려주면서 연산을 한다
		for(int i=0; i<n; i++) {
			
			if(arr[i]%2==0) {
				p++;
			}else {
				q++;
			}
			
			if(q==k) { // 홀수가 k개가 될때까지 홀수 짝수의 개수와 e의 위치를 옮겨준다
				e=i;
				break; 
			}
		}
		
		answer = p;
		
		
		
		for(int i=0; i<n; i++) { // i는 start pointer
		
			while(q<=k) {  // 삭제한 홀수의 개수가 k개 이하일 때 까지
			
			if(q==k){answer=Math.max(answer, p);} //삭제한 홀수개수가 k개일때
			
			e++; 
			
			if(e>=n) {e--;break;} //배열의 끝부분을 넘어서게 되면 while문을 빠져나간다
			
			if(arr[e]%2==0) { //짝수일 경우
				
				p++;
				
			}
			else { //홀수일 경우
				q++;
			}
		   
			}
			
			if(arr[i]%2==0)p--; // 다음 시작점으로 옮기기 전에 현재 시작점에 있는 수가 홀수인지 짝수인지 판별하고 빼준다
			else q--;
			
		}
		
		
		System.out.println(answer);
	
	}
	
	
}

- 슬라이딩윈도우로 푸는 문제이다. 

'백준 > 슬라이딩윈도우' 카테고리의 다른 글

회전초밥 - Java  (0) 2021.10.06
DNA비밀번호  (1) 2021.10.02
N번째 큰수  (0) 2021.10.02
게으른 백곰 - 10025번(Java)  (0) 2021.09.16
꿀아르바이트 - 12847번(Java)  (0) 2021.09.16