ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2003번 수들의 합 2 (JAVA)
    알고리즘(Algorithm)/투 포인터(Two-pointer) 2022. 2. 13. 21:25

    백준 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

    문제

    N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.

    입력

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

    출력

    첫째 줄에 경우의 수를 출력한다.


    소스 코드

    - 투  포인터(Two-pointer) 기본 형식 문제

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.StringTokenizer;
    
    public class Main {
    	private static int N, M, ans;
    	private static int[] A;
    	public static void main(String[] args) throws Exception{
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    		StringTokenizer st;
    		
    		st = new StringTokenizer(br.readLine());
    		N = Integer.parseInt(st.nextToken());
    		M = Integer.parseInt(st.nextToken());
    		
    		A = new int[N];
    		st = new StringTokenizer(br.readLine());
    		for (int i = 0; i < N; i++) {
    			A[i] = Integer.parseInt(st.nextToken());
    		}
    		ans = 0;
    		int sum = 0;
    		int start = 0;
    		int end = 0;
    		while (start < N) {
    			if(sum > M || end == N) {
    				sum -= A[start];
    				start++;
    			}else {
    				sum += A[end];
    				end++;
    			}
    			if(sum == M) ans++;			
    		}
    		bw.write(ans + "\n");
    		bw.flush();
    		bw.close();
    		br.close();
    	}
    }

     

    댓글

Designed by Tistory.