Java 코딩테스트 공부/Java 백준 문제풀이
자바 백준 1806번 문제 - 부분합
daramG
2022. 8. 2. 21:21
문제출처 : https://www.acmicpc.net/problem/1806
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
문제 :
소스코드 :
import java.util.*;
class Main {
// 투포인터 알고리즘 + 슬라이딩 윈도우 알고리즘
public int solution(int n, int s, int[] arr) {
int lt = 0, sum = 0;
int answer = Integer.MAX_VALUE;
for(int rt=0; rt<n; rt++) {
sum += arr[rt];
while (sum >= s) {
answer = Math.min(answer, rt - lt + 1);
sum -= arr[lt++];
}
}
if (answer == Integer.MAX_VALUE) answer = 0;
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int s = sc.nextInt();
int[] arr = new int[n];
for(int i=0; i<n; i++) {
arr[i] = sc.nextInt();
}
System.out.println(T.solution(n, s, arr));
}
}
풀이 : 투포인터와 슬라이딩 윈도우 알고리즘을 적용하면 아주 쉽게 풀리는 문제이다.
lt와 rt 투포인터를 잡고 for문으로 rt값을 이동시키며 연속된 수들의 합이 s를 넘길 경우 lt값을 이동시키며
최소 길이를 Math.min을 통해 구한다.