be_better

[백준] 2003번 - 수들의 합 2 본문

코딩테스트/백준

[백준] 2003번 - 수들의 합 2

NiceTry 2023. 8. 29. 21:19

목차

    💎 문제 링크

     

    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

     

    📝 문제

     

    ✍🏻 입력 & 출력

    🤔 풀기 전에 생각하기

    투 포인터를 사용하면 쉽게 해결되는 문제

     

    ✨ 풀이

    import java.util.Scanner;
    
    public class bj2003_수들의합2 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
    
            int N = scanner.nextInt();
            int M = scanner.nextInt();
            int[] numbers = new int[N];
    
            for (int i = 0; i < N; i++) {
                numbers[i] = scanner.nextInt();
            }
    
            int count = 0; // 수들이 합이 M과 같을 때 count 증가
            int sum = 0;   // 연속된 수들의 합
            int p1 = 0;    // 앞에서 나아갈 포인터
            int p2 = 0;    // 뒤에서 쫓아갈 포인터
            while (true) {
                if (sum > M) { // 합이 M보다 커지면
                    sum -= numbers[p2++]; // p2를 증가시키면서 앞에서 부터 하나씩 빼준다.
                } else if (p1 == numbers.length) { // 앞에서 나아가는 p1이 배열의 끝에 도달하면 break
                    break;
                } else {
                    sum += numbers[p1++]; // 배열의 끝이 아니고 합이 M보다 아직 작다면 p1증가시키면서 숫자 합산
                }
    
                if (sum == M) { // 합이 M과 같은 순간에 count 증가
                    count++;
                }
            }
    
            System.out.println(count);
        }
    }