문제 출처 - Baekjoon Online Judge
문제는 여기
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
[문제]
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. 값들을 입력받아준다.
2. 입력받은 값들을 투포인터를 사용해서 탐색을 한다.
[접근]
1. 투포인터를 사용해서 합이 같을 때를 찾아 카운터를 증가시켜 주는 방식으로 처리하면 되겠다고 생각했다.
[코드]
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n;
static int m;
static int[] arr;
static int cnt;
public static void main(String[] args) throws Exception {
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());
}
// 투포인터
int left = 0; // 왼쪽 포인터
int right = 0; // 오른쪽 포인터
int len = arr.length;
int sum = 0;
while(left <= right) {
if(sum >= m) {
sum -= arr[left];
left++;
}
else if(right >= len) {
break;
}
else {
sum += arr[right];
right++;
}
// 주어진 값과 합이 같다면
if(sum == m) {
cnt++; // 횟수 증가
}
}
System.out.println(cnt);
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S5 1996번 지뢰 찾기 (JAVA) (0) | 2022.01.26 |
---|---|
[백준] S1 4889번 안정적인 문자열 (JAVA) (0) | 2022.01.23 |
[백준] S3 2548번 대표 자연수 (JAVA) (0) | 2022.01.18 |
[백준] S4 1388번 바닥 장식 (JAVA) (0) | 2022.01.16 |
[백준] S2 1138번 한 줄로 서기 (JAVA) (0) | 2022.01.14 |