반응형
➕ 부분합
투 포인터는 처음이라..
잘 익혀놔야겠다 !
문제
10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
출력
첫째 줄에 구하고자 하는 최소의 길이를 출력한다. 만일 그러한 합을 만드는 것이 불가능하다면 0을 출력하면 된다.
🔑 IDEA
투 포인터 알고리즘을 이용한다.
잘 정리된 블로그가 있어 여기에 링크를 걸어둔다.
💡 나의 풀이
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
class Main {
static int N;
static int S;
static int[] seq;
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());
seq = new int[N];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
seq[i] = Integer.parseInt(st.nextToken());
}
System.out.println(getMinLen());
}
private static int getMinLen() {
int minLen = Integer.MAX_VALUE;
int left = 0;
int right = 0;
int sum = 0;
while(true) {
if(sum >= S) {
sum -= seq[left++];
minLen = Math.min(minLen, right-left+1);
}
else if(right == N) break;
else sum += seq[right++];
}
return minLen == Integer.MAX_VALUE ? 0 : minLen;
}
}
반응형
'Algorithm Test > 백준' 카테고리의 다른 글
[백준] 최소 스패닝 트리 (JAVA) (0) | 2021.05.14 |
---|---|
[백준] 1916. 최소비용 구하기 (JAVA) (0) | 2021.05.14 |
[백준] 1700. 멀티탭 스케줄링 (JAVA) (0) | 2021.05.11 |
[백준] 1062. 가르침 (JAVA) (0) | 2021.05.11 |
[백준] 14719. 빗물 (JAVA) (0) | 2021.05.11 |