알고리즘(Algorithm)의 종류, 분류/여러 가지 기법

[JAVA]백준 2003번: 수들의 합 2

Miiko 2021. 10. 4. 14:11

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

 

 

 

 

| 문제 해결방법

 

⭐Idea : 투 포인터 알고리즘

 

 

[JAVA] 해설 코드

 

package week11;

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

public class BOJ_2003 {

	static int N,count;
	static long M;
	static int[] arr;
	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());
		}
		
		partSum();
				
		System.out.println(count);
	

	}
	private static void partSum() {
		// start와 end가 동일하게 첫 요소를 가리키는 상태로 시작
		int start = 0; int end = 0;
		long sum=arr[0];

		while(true) {
			if(sum>=M) {
				// sum이 M과 같으면  count +1
				if(sum==M) 
					count++;
				// sum에서 기존 arr[start]값 삭제 후 start 포인터 +1
				sum-= arr[start++];
			}else {
				end++;
				if(end==N)
					break;
				sum+= arr[end];
			}
		}
		
	}

}

 

 

[제출] 메모리 및 시간

 

✔ 위 : for문을 사용하지 않고, 위 코드로 실행시킨 경우 ( for문 사용X )

 

아래 : for문으로 start , end index가 변경될 때마다 for문을 돌려준 경우 ( for문 사용 )