Notice
Recent Posts
Recent Comments
Link
04-28 00:12
«   2025/04   »
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
Archives
Today
Total
관리 메뉴

<<개발일지>>

[복합적 문제] 6.최대 길이 연속부분수열 본문

코딩테스트

[복합적 문제] 6.최대 길이 연속부분수열

개발하는지호 2023. 12. 28. 03:03
6. 최대 길이 연속부분수열
 

설명

0과 1로 구성된 길이가 N인 수열이 주어집니다. 여러분은 이 수열에서 최대 k번을 0을 1로 변경할 수 있습니다. 여러분이 최대 k번의 변경을 통해 이 수열에서 1로만 구성된 최대 길이의 연속부분수열을 찾는 프로그램을 작성하세요.

만약 길이가 길이가 14인 다음과 같은 수열이 주어지고 k=2라면

1 1 0 0 1 1 0 1 1 0 1 1 0 1

여러분이 만들 수 있는 1이 연속된 연속부분수열은

이며 그 길이는 8입니다.

입력

첫 번째 줄에 수열의 길이인 자연수 N(5<=N<100,000)이 주어집니다.

두 번째 줄에 N길이의 0과 1로 구성된 수열이 주어집니다.

출력

첫 줄에 최대 길이를 출력하세요.

예시 입력 1 

14 2
1 1 0 0 1 1 0 1 1 0 1 1 0 1

예시 출력 1

8

 

 

 

<<풀이>>

 

-나의 풀이-

 

시간 복잡도 : O(N)

 

알고리즘 : 투 포인터

 

우선, ㅋㅋ 틀렸다. 예시 입력과 출력은 정답이지만 돌려보니 어디선가 오류가 있는 것 같다.

내 논리상 맞는거 같은데,, 어디서 문제일까 ㅠㅠ

import java.util.*;

class Main {
    public int solution(int n, int m, int[] arr) {
        int lt = 0, sum = 0, max = 0, count = 0;
        for(int rt = 0; rt < n; rt++) {
            if(arr[rt] == 1) {
                sum += arr[rt];
            } else if (arr[rt] == 0) {
                if(count++ < m) {
                    sum += 1;
                } else {
                    if (sum > max) {
                        max = sum;
                        sum = 0;
                        lt ++;
                        rt = lt;
                        count = 0;
                    }
                }
            }
        }
        return max;
    }

    
    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }
        System.out.print(T.solution(n, m, arr));
    }
}

 

-강사님 풀이-

 

시간 복잡도 : O(N)

 

알고리즘 : 투 포인터

import java.util.*;

class Main {
    public int solution(int n, int m, int[] arr) {
        int lt = 0,  cnt = 0, answer = 0;
        for(int rt = 0; rt < n; rt++) {
            if(arr[rt] == 0) cnt++;
            while(cnt > m) {
                if(arr[lt] == 0) cnt--;
                lt++;
            }
            answer = Math.max(answer, rt -lt + 1);
        }
        return answer;
    }


    public static void main(String[] args) {
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = in.nextInt();
        }
        System.out.print(T.solution(n, m, arr));
    }
}

 

ㅋㅋㅋ 캬  ~ 멋지게 푸셨다. ㅋㅋ 아니 rt - lt + 1을 할 생각을 하다니..

 

일단은 나의 윗 문제가 왜 틀렸는지는 모르겠지만 확실히 강사님 방법은 직관적인 것은 분명하다. ㅠㅠ

 

그리고 내장 클래스 Math를 많이 쓰는데 코드 줄 줄이기에 정말 좋은거 같다!!

 

나도 활용 자주해야쓰겄다~~

 

*나의 풀이가 왜 틀렸는지 꼭 찾아와서 업뎃하겠다.

'코딩테스트' 카테고리의 다른 글

[HashMap] 2. 아나그램  (1) 2023.12.31
[해쉬] 1. 학급 회장  (0) 2023.12.30
[투 포인터] 5. 연속된 자연수의 합  (0) 2023.12.26
[복합문제] 4. 연속 부분수열  (0) 2023.12.24
[슬라이딩 윈도우] 3. 최대 매출  (0) 2023.12.24