코딩 테스트
[백준] 1806번 부분합 자바(Java)
한 면만 쓴 종이
2025. 3. 25. 17:33
https://www.acmicpc.net/problem/1806
전형적인 투포인터 문제다.
투포이터는 O(N)의 시간복잡도를 갖는다. 시간제한이 0.5초인 이 문제에 사용하기 딱이다. (사실 자바는 1초 제한.. ㅠ)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int[] arr = new int[N + 1];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int left = 0;
int right = 0;
int sum = 0;
int ans = Integer.MAX_VALUE;
while (right <= N && left >= 0) {
if (sum >= S) {
ans = Math.min(ans, right - left);
sum -= arr[left++];
} else {
sum += arr[right++];
}
}
if (ans == Integer.MAX_VALUE) {
ans = 0;
}
System.out.println(ans);
}
}
[기억하자]
투 포인터
- O(n) 의 시간복잡도를 가진다.
- 구간합, 부분합 연산에 사용하기 적합하다.
- 이름이 비슷한(?) 이분탐색과는 차이가 크다. 투 포인터는 보통 연속된 구간의 특성을 활용하여 조건을 만족하는 구간을 찾고, 이분탐색은 특정 값을 찾기 위해 많이 사용되는 알고리즘이다.