https://www.acmicpc.net/problem/14465
코드설명
투포인터(Two Pointer) 를 활용합니다.
처음 문제를 보고 파라매트릭 서치인가? 라는 생각이 들었습니다.
하지만, 문제를 보면 연속된 K라는 조건이 주어지므로 투포인터로 O(N) 의 시간복잡도로 풀 수 있다는 것을 알 수 있습니다.
사실 N의 범위가 나오지 않아서 좀 애매하긴 하지만, 빠르게 풀수록 좋습니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, K, B;
static int answer = 0;
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());
B = Integer.parseInt(st.nextToken());
arr = new int[N];
answer = N - B;
Arrays.fill(arr, 1);
for(int i=0;i<B; i++) {
st = new StringTokenizer(br.readLine());
arr[Integer.parseInt(st.nextToken()) - 1] = 0;
}
answer = twoPointer();
System.out.println(answer);
}
static int twoPointer() {
int signalPillow = 0;
for(int i=0;i<K-1;i++) {
signalPillow += arr[i];
}
for(int i=K-1; i<N; i++) {
signalPillow += arr[i];
//몇개를 고쳐야하는가?
answer = Math.min(answer, K - signalPillow);
signalPillow -= arr[i - (K - 1)];
}
return answer;
}
}
'알고리즘 > Two Pointer' 카테고리의 다른 글
[백준] 1522 문자열 교환 - 슬라이딩 윈도우(Sliding Window) JAVA (0) | 2024.09.25 |
---|---|
[백준] 30804 과일 탕후루 - 투포인터(Two Pointer) JAVA (0) | 2024.09.13 |
[백준] 12891 DNA 비밀번호 - 투포인터(Two Pointer) JAVA (0) | 2024.09.04 |
[LeetCode] 88. Merge Sorted Array - Two Pointer(투포인터) JAVA (0) | 2023.12.23 |
[백준] 2473 세 용액 - 투포인터(Two Pointer) JAVA (0) | 2023.11.13 |