문제 : boj2003
우선 i번째 수 부터 j번째 수까지의 합을 쉽게 알 수 있는 방법을 생각해보자. 누적합을 미리 구해둔다면 O(1)에 i번째 수부터 j번째 수까지의 합을 구할 수 있다.
예를들어 '4 7 2 1'을 확인해보자. 다음과 같이 누적합 배열(arr)을 마련해두면, i번째부터 j번째 수까지의 합은 arr[j]-arr[i-1]로 O(1)에 바로 구할 수 있다.
그럼 이제 합이 m이 되는 경우의 수를 구해야 한다. 더 효율적으로 하려면 투 포인터 개념을 활용하면 되지만, 이 문제의 경우 그냥 모든 경우를 확인하면 된다. 즉 i=1일 때 j=i~n의 모든 경우, i=2일 때 j=i~n의 모든 경우, ... i=n일 때 j=i~n인 모든 경우를 다 보면 된다.
코드 : github
import java.io.DataInputStream;
import java.io.IOException;
public class Main extends FastInput {
private void solution() throws Exception {
int n = nextInt();
int m = nextInt();
int[] arr = new int[n+1];
for (int i = 1; i <= n; i++) {
arr[i] = arr[i-1] + nextInt();
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j <= n; j++) {
if (arr[j]-arr[i-1] == m) cnt++;
}
}
System.out.println(cnt);
}
public static void main(String[] args) throws Exception {
initFI();
new Main().solution();
}
}
class FastInput {
private static final int DEFAULT_BUFFER_SIZE = 1 << 16;
private static DataInputStream inputStream;
private static byte[] buffer;
private static int curIdx, maxIdx;
protected static void initFI() {
inputStream = new DataInputStream(System.in);
buffer = new byte[DEFAULT_BUFFER_SIZE];
curIdx = maxIdx = 0;
}
protected static int nextInt() throws IOException {
int ret = 0;
byte c = read();
while (c <= ' ') c = read();
boolean neg = (c == '-');
if (neg) c = read();
do {
ret = ret * 10 + c - '0';
} while ((c = read()) >= '0' && c <= '9');
if (neg) return -ret;
return ret;
}
private static byte read() throws IOException {
if (curIdx == maxIdx) {
maxIdx = inputStream.read(buffer, curIdx = 0, DEFAULT_BUFFER_SIZE);
if (maxIdx == -1) buffer[0] = -1;
}
return buffer[curIdx++];
}
}
'PS > BOJ' 카테고리의 다른 글
백준 1417 자바 - 국회의원 선거 (BOJ 1417 JAVA) (0) | 2022.03.24 |
---|---|
백준 17756 자바 - Kieszonkowe (BOJ 17756 JAVA) (0) | 2022.03.24 |
백준 1707 자바 - 이분 그래프 (BOJ 1707 JAVA) (0) | 2022.03.22 |
백준 18384 자바 - PRIM (BOJ 18384 JAVA) (0) | 2022.03.22 |
백준 1035 자바 - 조각 움직이기 (BOJ 1035 JAVA) (0) | 2022.03.21 |
댓글