코딩테스트

[힌트 문제3-3] 수들의 합2

개발하는지호 2023. 10. 6. 14:52

백준 2003번

 

문제

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을 넘지 않는 자연수이다.

출력

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

예제 입력 1 

4 2
1 1 1 1

예제 출력 1 

3

예제 입력 2 

10 5
1 2 3 4 2 5 3 1 1 2

예제 출력 2 

3

 

 

<<풀이>>

 

package sec01.hint3_1;

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

public class pjh_numberssum {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str1 = br.readLine();
        StringTokenizer st1 = new StringTokenizer(str1);
        int ans = 0;

        int N = Integer.parseInt(st1.nextToken());
        int M = Integer.parseInt(st1.nextToken());

        System.out.println("다음 번 째 줄을 입력하라");

        String str2 = br.readLine();
        StringTokenizer st2 = new StringTokenizer(str2);
        int[] A = new int[N];

        for (int i = 0; i < N; i++) {
            A[i] = Integer.parseInt(st2.nextToken());
        }

        for (int i = 0; i < N; i++) {
            int partsum = 0;
            int totalsum = 0;
            if (A[i] == M) {
                ans++;
            }
            for (int j = i+1; j < N; j++) {
                partsum += A[j];
                totalsum = A[i] + partsum;
                if (totalsum == M) {
                    ans++;
                }


            }
        }
        System.out.println(ans);
    }
}

 

문제 자체는 어렵지 않다. 다만, 문제를 읽을 때 이해하기가 아직 시간이 걸리는 것 같다. 조금 더 익숙해질 필요가 있다.

또한, 문제를 풀 때 어렵다면 가만히 멍때리는 것이 아니라 내가 무엇을 모르는지 정확하게 파악하는 메타인지 능력을 기를 필요가 있다.

그렇게 하니 훨씬 더 몰입하고 머리가 잘 돌아간다.