https://www.acmicpc.net/problem/1806
N짜리 수열S 이상이 되는 것 중, 가장 짧은 것의 길이 출력투 포인터와 누적합을 활용하면 쉽게 풀 수 있는 문제입니다.
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());
// 배열 초기화
st = new StringTokenizer(br.readLine());
arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
System.out.println(twoPointer());
}
n: 배열의 길이s: 부분합 static final int INF = 1_000_000_000;
private static int twoPointer() {
int sum = 0, best = INF, left = -1;
for (int right = 0; right < n; right++) {
sum += arr[right];
while (left < right && sum >= s) {
sum -= arr[++left];
best = Math.min(best, right - left + 1);
}
}
return best == INF ? 0 : best;
}
sum: arr에서 left ~ right의 부분합best: 부분합의 길이right 인덱스를 늘려가며 누적합을 진행합니다.sum의 크기가 s이상이 될 경우left 인덱스를 늘려줍니다.best의 크기도 업데이트해 줍니다.best를 리턴해 주었습니다.import java.util.*;
import java.io.*;
public class Main {
static int n, s;
static int[] arr;
static final int INF = 1_000_000_000;
private static int twoPointer() {
int sum = 0, best = INF, left = -1;
for (int right = 0; right < n; right++) {
sum += arr[right];
while (left < right && sum >= s) {
sum -= arr[++left];
best = Math.min(best, right - left + 1);
}
}
return best == INF ? 0 : best;
}
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());
st = new StringTokenizer(br.readLine());
arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
System.out.println(twoPointer());
}
}