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

(백준/자바) 힌트문제3 03. 투 포인터 - 백준 2003번 문제 : 수들의 합2

by son_i 2023. 8. 6.
728x90

2003번: 수들의 합 2 (acmicpc.net)

 

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

* 생각해야 할 점 :

 1. 수열을 정렬하면 안됨.

 2. p2하나만 써도 됨.p1을 for의 i가 대신 해줌. for문 안에 while문으로 조건 검사

total += arr[p2++] 을 하면서 중간에 total == M이면 다음 p1으로 넘어감

나는 while문 밖에 total==M인 조건 검사를 해줬는데 틀렸다고 함.

p2한 번이 씹히는 거 같음.

 

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

public class TwoPointer_03 {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int arr[] = new int[N];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int answer = 0;
        for (int i = 0; i < N; i++) {
            int p2 = i;
            int total = 0;

            while (p2 < N && total < M) {
                total += arr[p2++];

                if (total == M) {
                    answer++;
                    break;
                } else if (total > M) {
                    break;
                }
            }
        }
        System.out.println(answer);
    }
}