문제 설명
1. 연속된 부분집합 수열에서의 합이 M 이 되면 된다.
풀이
1. 투 포인터를 사용했다.
증명
1. left right 가 인덱스를 저장해서 영역을 지정한다.
2. sum 이 더 크면 left 가 오른쪽으로 한 칸 오면서 빼고
3. 더 작으면 right 가 오른쪽으로 한 칸 가면서 더한다.
4. 반복하면 O(N)
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
import java.io.*; | |
/** | |
* https://www.acmicpc.net/problem/2003 | |
* BOJ 백준온라인져지 2003 수들의 합 2 풀이 | |
*/ | |
public class Main { | |
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); | |
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()); | |
int arr[] = new int[N]; | |
st = new StringTokenizer(br.readLine()); | |
for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken()); | |
int sum = 0; | |
int l = 0, r = 0; | |
int result = 0; | |
while (true) { | |
if (sum >= M) sum -= arr[l++]; | |
else if (r == N) break; | |
else sum += arr[r++]; | |
if (sum == M) result++; | |
} | |
bw.write(String.valueOf(result)); | |
bw.flush(); | |
} | |
} |
문제
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
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 2805 나무 자르기 풀이 (0) | 2018.06.16 |
---|---|
BOJ 백준온라인져지 1309 동물원 풀이 (0) | 2018.06.15 |
BOJ 백준온라인져지 2133 타일 채우기 풀이 (0) | 2018.06.14 |
BOJ 백준온라인져지 2902 KMP는 왜 KMP일까? 풀이 (0) | 2018.06.14 |
BOJ 백준온라인져지 2522 별 찍기 - 12 풀이 (0) | 2018.06.13 |