Algorithm/inflearn

★최대 길이 연속부분수열

마닐라 2021. 9. 15. 10:51

 

import java.util.Scanner;

public class Main {
    public int solution(int n, int m, int[] arr){
        int answer = 0, cnt = 0, lt = 0; // cnt는 0을 1로 바꾼 횟수

        for(int rt = 0; rt < n; rt++) {
            if(arr[rt] == 0) cnt++; //0을 만나면 cnt를 증가

            while(cnt > m) { //1로 바꾼 횟수가 초과하면(0을 m번 초과해서 만나면)
                if(arr[lt] == 0) cnt--; //0인 지점을 찾아서 줄여줌
                lt++;
            }

            //rt-lt+1은 1이 연속된 연속부분수열의 길이
            answer = Math.max(answer, rt-lt+1);
        }
        //rt=0일 때 그냥 rt++ answer = 1
        //rt=1일 때도 그냥 rt++ answer = 2
        //rt=2일 때 arr[2]=0; cnt=1; answer = 3
        //rt=3일 때 arr[3]=0; cnt=2; answer = 4
        //rt=4일 때 그냥 rt++ answer = 5
        //rt=5일 때 그냥 rt++; answer = 6
        //rt=6일 때 arr[6]=0; cnt=3 3>2이므로 arr[2]=0 이므로 cnt=2 lt=3 answer = 4

        return answer;
    }

    public static void main(String[] args){
        Main T = new Main();

        Scanner kb = new Scanner(System.in);

        int n = kb.nextInt();
        int m = kb.nextInt();
        int[] arr = new int[n];

        for(int i = 0; i<n; i++) {
            arr[i] = kb.nextInt();
        }

        System.out.print(T.solution(n, m, arr));

    }
}

'Algorithm > inflearn' 카테고리의 다른 글

★아나그램(Hash)  (0) 2021.09.15
#학급 회장(Hash)  (0) 2021.09.15
연속된 자연수의 합(two pointers)  (0) 2021.09.14
★연속 부분수열  (0) 2021.09.14
★공통원소 구하기  (0) 2021.09.13