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 |