[백준] 1806번 - 부분합 [Java][C++]
[백준] 1806번 - 부분합 [Java][C++]
1. 문제 풀이
$10,000$ 이하의 자연수로 이루어진 길이 $N$ 짜리 수열에 대해 연속된 수들의 부분합 중 합이 $S$ 이상인 가장 짧은 구간의 길이를 구하는 문제다. 단순한 브루트 포스로는 시간 내에 해결할 수 없는데 투 포인터를 활용하면 해결할 수 있다.
투 포인터는 두 포인터를 수열의 맨 앞부터 출발시키고 두 포인터의 사이가 바라보는 구간이 된다. 구간합이 $S$ 보다 크면 왼쪽 포인터를 이동하고 구간합이 $S$ 보다 작으면 오른쪽 포인터를 이동하면 되고 구간합이 $S$ 일 경우 최소 길이를 갱신하며 찾으면 된다.
2. 코드
1. 투 포인터 [Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.io.*;
import java.util.*;
public class Main {
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 S = 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 left = 0;
int right = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
while (true) {
if (sum < S) {
sum += arr[right++];
} else {
min = Math.min(min, right - left);
sum -= arr[left++];
}
if (right == N && sum < S) break;
}
if (min == Integer.MAX_VALUE) {
System.out.println(0);
} else {
System.out.println(min);
}
}
}
2. 투 포인터 [C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, s;
cin >> n >> s;
vector<int> v(n);
for (int& x : v) cin >> x;
int l = 0;
int r = 0;
int sum = 0;
int mn = INT_MAX;
while (true) {
if (sum < s) {
sum += v[r++];
} else {
mn = min(mn, r - l);
sum -= v[l++];
}
if (r == n && sum < s) break;
}
if (mn == INT_MAX) {
cout << 0;
} else {
cout << mn;
}
}
3. 풀이 정보
1. 투 포인터 [Java]
| 언어 | 시간 | 메모리 | 코드 길이 |
|---|---|---|---|
| Java 11 | 260 ms | 24304 KB | 1075 B |
2. 투 포인터 [C++]
| 언어 | 시간 | 메모리 | 코드 길이 |
|---|---|---|---|
| C++ 17 | 8 ms | 2412 KB | 561 B |
This post is licensed under CC BY 4.0 by the author.