https://www.acmicpc.net/problem/1806
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
- 10,000 이하의 자연수로 이루어진 길이 N짜리 수열이 주어진다. 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이를 구하는 프로그램
문제 풀이
[백준/BOJ] 1806번 부분합 (C/C++) (tistory.com)
[백준/BOJ] 1806번 부분합 (C/C++)
백준 온라인 저지(BOJ) 1806번 부분합 https://www.acmicpc.net/problem/1806 1806번: 부분합 첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공
rightbellboy.tistory.com
- start, end 2개의 포인터로 부분합의 시작과 끝을 아래 조건에 따라 하나씩 늘려가면서 길이를 찾으면 됨
1) 현재 부분합이 S보다 작은 경우
- end를 오른쪽으로 한 칸 이동하고 sum에 arr[end] 값을 더해준다.
2) 현재 부분합이 S보다 크거나 같은 경우
- 현재 len값과 현재 부분합의 길이(end-start+1)를 비교하여 작은 값을 len에 기록
- 다음 탐색을 위해 sum에 arr[start]값을 빼주고 start를 오른쪽으로 한칸 이동
정답
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main
{
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); //수열의 길이
int S = Integer.parseInt(st.nextToken()); //합
int arr[] = new int[N+1];
st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++)
{
arr[i] = Integer.parseInt(st.nextToken());
}
int start = 0;
int end = 0;
int sum = arr[0];
int len = N+1;
while(start<=end&& end<N)
{
if(sum <S)
{
sum += arr[++end];
}
else
{
len = Math.min(len, end-start + 1);
sum -= arr[start++];
}
}
if(len == N+1)
len = 0;
bw.write(String.valueOf(len));
bw.flush();
bw.close();
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 1450 냅색문제 (0) | 2024.03.20 |
---|---|
[JAVA] 백준 1644 소수의 연속합 (7) | 2024.03.19 |
[JAVA] 백준 2470 두 용액 (0) | 2024.03.17 |
[JAVA] 백준 3273 두 수의 합 (1) | 2024.03.17 |
[JAVA] 백준 11286 절댓값 힙 (0) | 2024.03.15 |