๋์ด๋ | ์ ๋ต๋ฅ |
โ โ โ | - % |
ํ๋ฆฌ๋ฏธ์ ์๊ณ ๋ฆฌ์ฆ ์ํด๋ฆฌ ๋นํ์๊ณ ์์ฆ3 1์ฃผ์ฐจ
๋ฌธ์
ํด๊ฒฐ
key point, N์ด 40์ผ๋ก ์์ ํ์์ผ๋ก ์ฐพ์๋ด๊ธฐ ๊ต์ฅํ ํฌ๊ธฐ ๋๋ฌธ์,
ํฌ๊ธฐ๊ฐ N์ธ ์งํฉ์ ์ ๋ฐ์ผ๋ก ๋๋ N/2ํฌ๊ธฐ์ ์งํฉ 2๊ฐ๋ก ๋ง๋ค์ด ํด๊ฒฐํ๋ค.
- ์ ๋ฐ์ผ๋ก ์งํฉ์ ๋๋ ๋ ์ด๋ป๊ฒ ๋๋ ๋ ์๊ด์์ง๋ง ๋๋ (0 ~ N/2 - 1), (N/2 ~ n - 1) ์ด๋ ๊ฒ ์ ๋ ฅ๋ฐ์ ์์์์ ์ ๋ฐ์ผ๋ก ๋๋ด๋ค.
- ๊ทธ๋ ๊ฒ ์ ๋ฐ์ผ๋ก ๋๋ ์งํฉ์ผ๋ก ์์ ํ์์ ์งํํด์ ๋ถ๋ถ์งํฉ์ ์ฐพ์๋ค.
์ด๋, ๊ณต์งํฉ 0์ ํฌํจํ์ฌ ๋ฐฐ์ด์ ๊ตฌ์ฑํด๋์ด์ผ ์ถํ ๋ถ๋ถ์งํฉ์ ํฉ์ ํ์ํ ๋ ์ฌ๋ฐ๋ฅธ ๋ต์ด ๋์ต๋๋ค. ์๋ํ๋ฉด, ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๊ณผ์ ์์ ์ด๋ฏธ ํํฉ๋ฌผ์ธ 0์ ์ฐพ์๋๋๋ฐ, ๊ณต์งํฉ์ด ์๋ค๋ฉด ํฌํฌ์ธํฐ๋ก ํ์ํ ๋, ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ด ์ ๋๋ก 0์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ๊ณต์งํฉ์ ํฌํจํ ๋ถ๋ถ๋ฐฐ์ด์ ๊ฐ๊ฐ ๊ตฌ์ฑํ ๋ค ๋ง์ง๋ง ์ถ๋ ฅํ ๋ ์ ์ธ์์ผ์ค๋๋ค. - ๊ทธ๋ฆฌ๊ณ ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํ์ฌ ํฉ์ด 0์ธ ํํ๋ฌผ์ ์ฐพ์๋ผ ํ
๋ฐ, ์ด๋ ๋ฐ๋์ ์ ๋ ฌ์ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ํ๋ฉด, ๋ถ๋ถ์งํฉ์ ์ ๋ ฌํ์ง ์๊ณ ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํ์ฌ ํฉ์ ๊ณ์ฐํ๋ฉด ๋ถ๋ถ์งํฉ์ ๋๋ ๋์ ์ด์ ๊ฐ ์ฌ๋ผ์ง๋ค.
→ O(N^2)
์ ๋ ฌ์ ํด์ผ ํฌํฌ์ธํฐ๋ฅผ ์ด์ฉํด์ ๋ ํฉ์ด ๊ธฐ์ค์ 0๋ณด๋ค ํด ๋ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๋ฅผ -๋ฐฉํฅ์ผ๋ก ์์ง์ด๊ณ , ๊ธฐ์ค์ ์ธ 0๋ณด๋ค ์์ ๋ ์ผ์ชฝ ํฌ์ธํฐ๋ฅผ +๋ฐฉํฅ์ผ๋ก ํ ์นธ์ฉ ์์ง์ฌ์ ํ์์ ํด์ผ ํจ์จ์ ์ธ ํ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. → O(N) - ์ผ์ชฝ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ๊ณผ ์ค๋ฅธ์ชฝ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ํฉ์ด 0์ด๋ผ๋ฉด, ํํ์ด๊ฐ ๋ง๋ค ์ ์๋ ํํฉ๋ฌผ๋ก ans์ ๊ฐ์ ์ฆ๊ฐ์์ผ์ผ ํ๋ค. ์ด๋ count๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
countํจ์๋ ๋ฐฐ์ด์ ๊ฐ์ด num์ธ ์์๊ฐ ๋ช๊ฐ ์๋์ง ์ฐพ๋ ํจ์์ ๋๋ค. upper_bound ๋ ๋ฐฐ์ด์์ num๋ณด๋ค ํฐ ๊ฐ๋ค ์ค ์ต์์ธ ์์น๋ฅผ ๋ฐํํ๊ณ , lower_bound๋ num๋ณด๋ค ์์ง ์๋ ๊ฐ๋ค ์ค ์ต์์ธ ์์น๋ฅผ ๋ฐํํฉ๋๋ค.
์ฆ, (num๋ณด๋ค ํฌ๋ฉด์, num๊ณผ ๊ฐ์ฅ ๊ฐ๊น์ด ์์น - num์ด ์์ํ๋ ์ฒซ ๋ฒ์งธ ์์น) ๊ฐ ๋ฉ๋๋ค.
์ด๋ ์ด๋ฏธ ๋ฐฐ์ด์ ์ ๋ ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์ผ์ด๊ณ , num์ ๊ฐ์๋ฅผ ํค์๋ฆฌ๋๋ฐ ํจ์จ์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ํฌ์ธํฐ๋ค์ ๊ฐ๊ฐ ํ ์นธ์ฉ ์ฎ๊ฒจ ์ค๋๋ค. - ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๋ํ ํฉ์ ํ์ํ๋ค๋ฉด ๋ง์ง๋ง ๋์ค๋ ans๊ฐ ์ ๋ต์ ๋๋ค. ํ์ง๋ง ๊ณต์งํฉ์ ํฌํจํ์ฌ ๊ณ์ฐํ์์ผ๋ฏ๋ก, ๊ณต์งํฉ์ ์ ์ธํ์ฌ ์ถ๋ ฅํด์ค๋๋ค. → ans - 1
์ฝ๋
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
41
42
43
44
45
46
47
48
49
50
51
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int n, arr[45];
vector<int> v[2];
void func(int idx, int end, int sum, int i) {
if (idx >= end) {
v[i].push_back(sum);
return;
}
func(idx + 1, end, sum, i);
func(idx + 1, end, sum + arr[idx], i);
}
ll count(vector<int>& t, int num) {
return upper_bound(t.begin(), t.end(), num) - lower_bound(t.begin(), t.end(), num);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// ์์ ํ์
func(0, n / 2, 0, 0);
func(n / 2, n, 0, 1);
// ์ ๋ ฌ - ํ์
sort(v[0].begin(), v[0].end());
sort(v[1].begin(), v[1].end());
// ํฌํฌ์ธํฐ
vector<int>::iterator l, r;
l = v[0].begin(), r = v[1].end() - 1;
ll ans = 0;
while (l != v[0].end() && r >= v[1].begin()) {
if (*l + *r == 0) {
ans += count(v[0], *l) * count(v[1], *r);
l = upper_bound(v[0].begin(), v[0].end(), *l);
r = lower_bound(v[1].begin(), v[1].end(), *r - 1);
}
else if (*l + *r > 0) {
if (r == v[1].begin()) break;
r--;
}
else l++;
}
// ๊ณต์งํฉ ์ ์ธ
printf("%lld", ans - 1);
return 0;
}
|
cs |
์์ ํ์์ ๋นํธ๋ง์คํฌ๋ก ํ๋ฉด...
๋นํ์๊ณ ํด์ค์์ ๋ฐ์ท
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
int main() {
int n, num; scanf("%d", &n);
vector<int> seq[2], sub[2];
for (int i = 0; i < n; ++i) {
scanf("%d", &num);
// ์ธ๋ฑ์ค๊ฐ ์ง์๋ฉด 0, ํ์๋ฉด 1ํ์ ๋๋ ์ ์
๋ ฅ ๋ฐ์
seq[i % 2].push_back(num);
}
for (int i = 0; i < 2; ++i) {
//๋นํธ๋ง์คํฌ๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๋ถ๋ถ์งํฉ ํ์ธ
for (int j = (1 << seq[i].size()); j > 0; --j) {
int sum = 0;
for (int k = 0; k < seq[i].size(); ++k)
if (j & (1 << k)) sum += seq[i][k];
sub[i].push_back(sum);
}
sort(sub[i].begin(), sub[i].end());
}
...
|
cs |
- ์ ๋ ฅ์ ๋ฐ์ ๋, ์ง์, ํ์ ์ธ๋ฑ์ค๋ก ๋๋ ๊ฐ๊ฐ 0 ๋๋ 1ํ์ ์ ๋ ฅ๋ฐ์๋ค.
- ๋ถ๋ถ์งํฉ์ ํค์๋ฆด ๋ ๋นํธ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ๋๋ ์ง ๋ฐฐ์ด์ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ค.
ํ๊ธฐ
์์ ํ์์ ํด์ผํ ๋ ํฌ๊ธฐ๊ฐ ๋๋ฌด ํฌ๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง ๋์ ํ ์๊ฐ์ด ์๋์ ํด์ค์ ํตํด์ ๊ณต๋ถํ ๋ฌธ์ ์ด๋ค. ๋ค์์ ์ด๋ฐ๋ฌธ์ ๋ฅผ ๋ง๋๋ค๋ฉด ๊ผญ ํ ์ ์๊ธธ!
ํฌํฌ์ธํฐ๊ฐ๋ ๋ ๋ค์ด๋ ๋ดค์์ง๋ง ๋ฌธ์ ์ ์ ์ฉํด๋ณด๋ ์ ์ธ๊ณ์๋ค. ์ญ์ ๊ณต๋ถํ ๊ฒ ๋๋ฌด ๋ง๋ค!
'๐ฅ PS(Problem Solving) ๐ฅ > goorm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ตฌ๋ฆLEVEL] ์ ๋ณ์ง๋ฃ์ (0) | 2020.05.02 |
---|---|
[๊ตฌ๋ฆLEVEL] ์จ๋ผ์ธ ๊ฐ์ (0) | 2020.04.01 |
[๊ตฌ๋ฆLEVEL] ํํ (0) | 2020.04.01 |
[๊ตฌ๋ฆLEVEL] ๋ง๊ฐ์ง ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (0) | 2020.03.27 |
[๊ตฌ๋ฆLEVEL] ๋ฒฝ ํต๊ณผํ๊ธฐ (0) | 2020.03.25 |
๋๊ธ