[백준] 2003번 수들의 합 2 java

쓰리원·2022년 5월 4일
0

코딩테스트

목록 보기
26/28
post-thumbnail

문제 링크 : https://www.acmicpc.net/problem/2003

1. 백준 2003번 문제

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. 출력

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

2. 문제 해석

인덱스로 구분되는 N개의 숫자들이 있을 때 인접하는 숫자의 값이 M이 되기 전까지 중복 없이 뽑아서 M의 값을 만드는 문제 입니다.

3. 문제 풀이

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);
    }
}
profile
가장 아름다운 정답은 서로의 협업안에 있다.

0개의 댓글