본문 바로가기
알고리즘/백준

[Java] BOJ 1806번 부분합

by 컴공맨 2021. 8. 3.
 

1806번: 부분합

첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.

www.acmicpc.net


풀이

투포인터를 사용해 해결했습니다.

자세한건 코드의 주석을 참고해주세요.


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	public static int N, S, answer;
	public static int[] num;
	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());
		
		num = new int[N];
		
		st = new StringTokenizer(br.readLine(), " ");
		for (int i = 0; i < N; ++i) {
			num[i] = Integer.parseInt(st.nextToken());
		}
		
		answer = Integer.MAX_VALUE;
		int l = 0, r = 0;
		int sum = num[0];
		while (r < N && l <= r) {
			if (sum >= S) {
				int len = r - l + 1;
				answer = (answer > len) ? len : answer;
			}
			
			if (sum < S) {
				// sum이 S보다 작은데 r이 끝에 도달했다는 의미는
				// 더이상 더할 숫자가 없으므로 이보다 큰 수를 만들 수 없다
				// 때문에 더이상 조사할 필요가 없다.
				if (r + 1 >= N) {
					break;
				}
				
				// r을 이동하고 이동한 다음 위치를 더해준다.
				sum += num[++r];
			}
			else {
				// 현재 위치를 빼고 l을 이동
				sum -= num[l++];
			}
		}
		
		System.out.println((answer == Integer.MAX_VALUE) ? 0 : answer);
	}
}

 

GitHub - pyo7410/Algorithm: 1일 1커밋을 목표로!

1일 1커밋을 목표로! Contribute to pyo7410/Algorithm development by creating an account on GitHub.

github.com

 

'알고리즘 > 백준' 카테고리의 다른 글

[Java] BOJ 15685번 드래곤커브  (0) 2021.08.06
[Java] BOJ 1504번 특정한 최단 경로  (0) 2021.08.04
[Java] BOJ 2573번 빙산  (0) 2021.08.02
[Java] BOJ 1261번 알고스팟  (0) 2021.07.30
[Java] BOJ 1707번 이분 그래프  (0) 2021.07.25