본문 바로가기
알고리즘/인프런(자바(Java) 알고리즘 문제풀이 입문

투포인터(3-6) 최대 길이 연속부분수열

by person456 2024. 1. 6.

문제 링크 : https://cote.inflearn.com/contest/10/problem/03-06

 

** 내가 처음 푼 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.util.*;
import java.util.stream.Stream;
import java.io.*;
 
class Solution{
    static int n,m,k;
    static StringTokenizer st;
    static StringBuilder sb;
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine(), " ");
        int[] arr = new int[n];
        for(int i=0; i<n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int start=0;
        int max=0;
        int cnt=0;
        for(int i=0; i<n; i++) {
            if(arr[i]==0)cnt++;
            if(cnt>m) {
                while(arr[start]!=0) {
                    start++;
                }
                start++;
                cnt--;
            }
        }
        System.out.println(max);
        br.close();
        bw.close();
    }
}
 
 

- 2개의 포인터를 옮겨가며, Right 포인터가 배열의 0을 만나면 count를 증가해주는 방식으로 최대 개수를 맞춤

- 하지만 left 포인터를 어떻게 사용해야 할지 감이 안잡힘

- 그래서 카운터가 최대치를 넘었다면, while문을 통해 0을 만날때까지 start 포인터의 위치를 변경

- 이후 한번 더 추가하고 cnt를 1개 내림

 

 

** 변경된 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.*;
import java.util.stream.Stream;
import java.io.*;
 
class Solution{
    static int n,m,k;
    static StringTokenizer st;
    static StringBuilder sb;
    public static void main(String[] args)throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        st = new StringTokenizer(br.readLine(), " ");
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine(), " ");
        int[] arr = new int[n];
        for(int i=0; i<n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }
        int start=0;
        int max=0;
        int cnt=0;
        for(int i=0; i<n; i++) {
            if(arr[i]==0)cnt++;
            while(cnt>m) {
                if(arr[start++]==0)cnt--;
            }
            max = Math.max(max, i-start+1);
        }
        System.out.println(max);
        br.close();
        bw.close();
    }
}
 
cs

- if문을 사용 안하고, while에서의 true, false를 기반으로 바로 검증하여 코드가 조금 더 간결해짐.