1. 문제
N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
2. 입력
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
3. 출력
첫째 줄에 경우의 수를 출력한다.
인덱스로 구분되는 N개의 숫자들이 있을 때 인접하는 숫자의 값이 M이 되기 전까지 중복 없이 뽑아서 M의 값을 만드는 문제 입니다.
import java.io.*;
import java.util.StringTokenizer;
public class Main {
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()); //M 값이 리턴 받을 값 이다.
int[] arr = new int[N];
st = new StringTokenizer(br.readLine());
for(int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
int start = 0, end = 0, sum = 0, cnt = 0;
while(true) {
//if(end == N && sum < M) { break; }
if(sum >= M) { //0>=2
sum = sum - arr[start++];
}//
else if(end == N) {
break;
}
else if(sum < M) { //0
sum = sum + arr[end++];
}
if(sum == M) {
cnt++;
}
}
System.out.println(cnt);
}
}