본문 바로가기

Algorithm

[Java] 백준 2003 : 수들의 합2

📌 문제

https://www.acmicpc.net/problem/2003

 

2003번: 수들의 합 2

첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

💻 소스코드

package baekjoon;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

// S.4, 수들의 합 2
public class B2003 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 수열의 길이
        int m = scanner.nextInt(); // 원하는 합

        List<Integer> list = new ArrayList<>(); // 수열을 저장할 리스트
        for (int i = 0; i < n; i++) {
            list.add(scanner.nextInt()); // 수열의 각 원소를 리스트에 추가
        }

        int count = 0; // 합이 m인 부분 수열의 개수
        int start = 0; // 부분 수열의 시작 인덱스
        int end = 0; // 부분 수열의 끝 인덱스
        int sum = 0; // 현재 부분 수열의 합

        while (true) {
            if (sum >= m) {
                sum -= list.get(start++); // 부분 수열의 합이 m 이상이면 start를 증가시켜 부분 수열의 첫 번째 원소를 제외하고 합에서 빼줌
            } else if (end == n) {
                break; // 수열의 끝까지 탐색한 경우 반복문 종료
            } else {
                sum += list.get(end++); // 부분 수열의 합이 m 미만인 경우 end를 증가시켜 부분 수열에 다음 원소를 추가하고 합에 더해줌
            }

            if (sum == m) {
                count++; // 부분 수열의 합이 m과 같은 경우 count를 증가시킴
            }
        }
        System.out.println(count); // 결과 출력
    }
}