PS/BOJ
1806
easy16
2022. 5. 4. 00:14
부분합 : https://www.acmicpc.net/problem/1806
이전에 풀었던 문제와 크게 다를것은 없다.
다만 속도를 위해 while문을 활용하여 빠르게 합을 구해주는 trick을 활용한다.
(2-point 알고리즘에서 항상 주의 해야되는 것은 변수의 범위를 잘 설정하는 것이며
기본틀은 머리속에 항상 있어야 한다.)
while (sum < S && rt <= N) {
sum += arr[rt++];
}
while (sum > S && lt < rt) {
sum -= arr[lt++];
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N, S, answer = Integer.MAX_VALUE;
static int[] arr;
private static boolean DBG = false;
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());
S = Integer.parseInt(st.nextToken());
arr = new int[N + 5];//IndextError가 발생하지 않도록 적당히 큰 배열 선택
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int lt = 0, rt = 0;
int sum = 0, cnt = 0;
while (rt <= N) {
while (sum < S && rt <= N) {
sum += arr[rt++];
}
while (sum > S && lt < rt) {
sum -= arr[lt++];
if (DBG)
System.out.printf(">[%d %d] answer : %d\n", lt, rt, answer);
answer = Math.min(answer, rt - lt + 1);
}
if (sum == S) {
sum -= arr[lt++];
if (DBG)
System.out.printf("=[%d %d] answer : %d\n", lt, rt, answer);
answer = Math.min(answer, rt - lt + 1);
}
}
System.out.println(answer==Integer.MAX_VALUE ? 0 : answer);
}
}