코딩테스트
[힌트 문제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);
}
}
문제 자체는 어렵지 않다. 다만, 문제를 읽을 때 이해하기가 아직 시간이 걸리는 것 같다. 조금 더 익숙해질 필요가 있다.
또한, 문제를 풀 때 어렵다면 가만히 멍때리는 것이 아니라 내가 무엇을 모르는지 정확하게 파악하는 메타인지 능력을 기를 필요가 있다.
그렇게 하니 훨씬 더 몰입하고 머리가 잘 돌아간다.