https://www.acmicpc.net/problem/2003
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
해석 및 팁
이 문제의 핵심은 투 포인터를 사용하는 것입니다. 반복문을 통해 sum과 m이 같으면 경우에 수의 해당하므로 count++을 해줍니다. sum이 m보다 크거나 같으면 left값을 증가시켜 주고 작으면 right값을 증가시켜 주면 됩니다. 마지막에 r이 n까지 오면 break를 통해 반복문을 탈출하면 됩니다.
Java 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int count = 0;
int l = 0;
int r = 0;
int sum = 0;
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
while(true) {
if(sum == m) count++; //합이 m과 같으면 count++
if(sum >= m) sum -= arr[l++]; //sum이 m보다 크거나 같으면 left증가
else if(r == n) break; //r이 끝까지 오면 break
else if(sum < m) sum += arr[r++]; //sum이 m보다 작으면 right 증가
}
System.out.println(count);
}
}
'백준' 카테고리의 다른 글
백준 10825 국영수(Java) (0) | 2023.01.27 |
---|---|
백준 10610 30(Java) (1) | 2023.01.27 |
백준 18258 큐 2(Java) (0) | 2023.01.26 |
백준 1021 회전하는 큐(Java) (0) | 2023.01.26 |
백준 1620 나는야 포켓몬 마스터 이다솜(Java) (1) | 2023.01.26 |