📌 문제 설명
0과 1로 구성된 길이가 N인 수열이 주어집니다. 이 수열에서 최대 K번 0을 1로 변경하여 만들 수 있는 1로만 이루어진 연속 부분수열의 최대 길이를 구하는 프로그램을 작성하세요. 예를 들어 N=14이고, 수열과 K가 다음과 같다면
1 1 0 0 1 1 0 1 1 0 1 1 0 1
K = 2
최대 2번 0을 1로 바꿨을 때 만들 수 있는 가장 긴 1의 연속부분수열은 아래와 같습니다.
[1 1 0 0 1 1 0 1 1 0 1 1 0 1]
↑-----------↑
연속된 길이 = 8
📝 입력 & 출력
입력
- 첫 줄: 수열의 길이 N과 정수 K (5 ≤ N < 100,000)
- 둘째 줄: 0과 1로 구성된 N개의 정수
출력
- 첫 줄에 최대 길이 출력
🔸 예제 입력 & 출력
예제 입력 1
14 2
1 1 0 0 1 1 0 1 1 0 1 1 0 1
예제 출력 1
8
💡 해결 방법
- 이 문제는 투 포인터 (슬라이딩 윈도우) 기법을 사용하여 해결할 수 있습니다.
- 윈도우 안에 있는 0의 개수를 세면서 그 개수가 K를 초과하면 왼쪽 포인터를 가장 먼저 등장한 0 다음 인덱스로 이동시킵니다.
- 각 구간마다 rt - lt + 1을 계산하여 최대 길이를 갱신합니다.
💻 코드 구현 (Java)
package partTwoPointers;
import java.util.*;
public class Problem6 {
public int solution(int n, int k, int[] arr){
int lt = 0, cnt = 0, result = 0;
for(int rt = 0; rt < n; rt++) {
if(arr[rt] == 0) cnt++;
if(cnt > k) {
while(arr[lt] != 0) lt++;
lt++;
cnt--;
}
result = Math.max(result, rt - lt + 1);
}
return result;
}
public static void main(String[] args) {
Problem6 T = new Problem6();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int k = kb.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
System.out.print(T.solution(n, k, arr));
kb.close();
}
}
📖 코드 설명
1️⃣ 슬라이딩 윈도우 탐색
for(int rt = 0; rt < n; rt++) {
if(arr[rt] == 0) cnt++;
- 우측 포인터(rt)를 이동시키며 0을 만났을 때 cnt 증가
2️⃣ 0의 개수가 K 초과 시 왼쪽 포인터 이동
if(cnt > k) {
while(arr[lt] != 0) lt++;
lt++; // 가장 먼저 등장한 0 다음 인덱스로 이동
cnt--;
}
- lt를 가장 먼저 등장한 0을 지나쳐 다음 인덱스로 이동시킴
3️⃣ 최대 길이 계산
result = Math.max(result, rt - lt + 1);
- 윈도우 크기 중 최대값을 저장
⏳ 시간 복잡도 분석
- 각 포인터가 배열을 한 번씩만 이동 → O(N)
출처: 인프런 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비 강의 | 김태원 - 인프런
김태원 | , 자바(Java) 알고리즘 문제풀이 채점사이트를 통해 기초부터 준비해보세요! 💪 [사진] 이 강의는 [사진] 자바(Java)로 코딩테스트 준비를 하고 계신 분께 추천드려요! 문제는 기초~ 중급
www.inflearn.com
'코딩테스트 > 자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비' 카테고리의 다른 글
| 섹션 4. HashMap, TreeSet - 1. 학급 회장(해쉬) (0) | 2025.03.30 |
|---|---|
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 5. 연속된 자연수의 합(수학) (0) | 2025.03.30 |
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 5. 연속된 자연수의 합(투 포인터) (0) | 2025.03.29 |
| 섹션 3 투 포인터 & 슬라이딩 윈도우 - 4. 연속 부분수열 (0) | 2025.03.29 |
| 섹션 3. 투 포인터 & 슬라이딩 윈도우 - 3. 최대 매출 (0) | 2025.03.27 |