[Gold IV] 부분합 - 1806
성능 요약
메모리: 22768 KB, 시간: 216 ms
구간합이 S 이상이 되는 것 중 구간이 가장 짧을 때의 길이를 출력하는 문제
❌ 접근 방법. 완탐
➡️ 해당 풀이법의 시간 복잡도 : → 시간 초과
⭕ 접근 방법. 투포인터, 슬라이딩 윈도
➡️ 해당 풀이법의 시간 복잡도 :
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_1806_2 {
static int N; // 배열의 요소 개수
static int S; // 부분 배열의 합이 될 목표 값
static int arr[]; // 입력 정수를 저장하는 배열
static int min = Integer.MAX_VALUE; // 최소 길이를 저장하는 변수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// N과 S를 입력으로 받음
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());
}
int start = 0; // 현재 부분 배열의 시작 인덱스
int end = 0; // 현재 부분 배열의 끝 인덱스
int sum = arr[end]; // 현재 부분 배열의 합
while (end < N) {
// 현재 부분 배열의 합이 목표 값 이상인 경우 최소 길이 갱신
if (sum >= S) {
min = Math.min(min, end - start + 1);
}
// 부분 배열의 합이 목표 값 미만이면 end를 증가시켜 합에 새로운 요소 추가
if (sum < S) {
end++;
if (end < N) {
sum += arr[end];
}
} else { // 부분 배열의 합이 목표 값 이상이면 start를 증가시켜 합에서 요소 제거
sum -= arr[start];
start++;
}
}
// 최소 길이 출력 (최소 길이가 초기값 그대로이면 부분 배열을 만들 수 없으므로 0 출력)
System.out.println(min == Integer.MAX_VALUE ? 0 : min);
}
}