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

코드설명

포인터 2개가 처음부터 같은방향으로 진행해나가는 투포인터를 활용하는 문제입니다.

 

투포인터를 활용하여 시간복잡도가 O(2*N) 입니다.

코드

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


public class Main {
	
	public static int N, M;
	public static int[] arr;
	public static int answer = 0;
    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());
    	M = Integer.parseInt(st.nextToken());
    	
    	
    	arr = new int[N];
    	st = new StringTokenizer(br.readLine());
    	for(int i = 0; i<N;i++) {
    		arr[i] = Integer.parseInt(st.nextToken());
    	}
    	
    	twoPointer();
    	System.out.println(answer);
    }
    
    public static void twoPointer() {
    	int start = 0;
    	int end = 0;
    	int intervalSum = 0;
    	
    	while(start < N) {
    		
    		while(intervalSum < M && end < N) {
    			intervalSum += arr[end];
    			end += 1;
    		}
    		
    		if(intervalSum == M) {
//    			System.out.println(" "+start+" "+end);
    			answer += 1;
    		}
    		
    		intervalSum -= arr[start];
    		start += 1;
    	}
    	
    }
 
    
}

+ Recent posts