๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ PS(Problem Solving) ๐Ÿ”ฅ/goorm

[๊ตฌ๋ฆ„LEVEL] ํ™”ํ•™์•ฝํ’ˆ

by dar0m! 2020. 4. 30.
๋‚œ์ด๋„ ์ •๋‹ต๋ฅ 
โ˜…โ˜…โ˜… - %

ํ”„๋ฆฌ๋ฏธ์—„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œ„ํด๋ฆฌ ๋น„ํƒ€์•Œ๊ณ  ์‹œ์ฆŒ3 1์ฃผ์ฐจ

 

๊ตฌ๋ฆ„EDU - Be Really Excellent!

๊ตฌ๋ฆ„EDU๋Š” ์ „๊ตญ ๋Œ€ํ•™, ๊ธฐ์—… ๋“ฑ์—์„œ ํ™œ์šฉ ์ค‘์ธ ์˜จ๋ผ์ธ ํ•™์Šต ๋ฐ ๊ต์ˆ˜ ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ IT๋ถ„์•ผ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ ๋ณด์„ธ์š”. ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปค๋ฆฌ์–ด ํŒจ์Šค์— ํ™•์‹คํ•œ ๋„์›€์„ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

edu.goorm.io

๋ฌธ์ œ

ํ•ด๊ฒฐ

key point, N์ด 40์œผ๋กœ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ์ฐพ์•„๋‚ด๊ธฐ ๊ต‰์žฅํžˆ ํฌ๊ธฐ ๋•Œ๋ฌธ์—,
ํฌ๊ธฐ๊ฐ€ N์ธ ์ง‘ํ•ฉ์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ  N/2ํฌ๊ธฐ์˜ ์ง‘ํ•ฉ 2๊ฐœ๋กœ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ•œ๋‹ค.
  1. ์ ˆ๋ฐ˜์œผ๋กœ ์ง‘ํ•ฉ์„ ๋‚˜๋ˆŒ ๋•Œ ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ ๋„ ์ƒ๊ด€์—†์ง€๋งŒ ๋‚˜๋Š” (0 ~ N/2 - 1), (N/2 ~ n - 1) ์ด๋ ‡๊ฒŒ ์ž…๋ ฅ๋ฐ›์€ ์ˆœ์„œ์—์„œ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆด๋‹ค.
  2. ๊ทธ๋ ‡๊ฒŒ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ ์ง‘ํ•ฉ์œผ๋กœ ์™„์ „ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•ด์„œ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ฐพ์•˜๋‹ค.

    ์ด๋•Œ, ๊ณต์ง‘ํ•ฉ 0์„ ํฌํ•จํ•˜์—ฌ ๋ฐฐ์—ด์„ ๊ตฌ์„ฑํ•ด๋‘์–ด์•ผ ์ถ”ํ›„ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์„ ํƒ์ƒ‰ํ•  ๋•Œ ์˜ฌ๋ฐ”๋ฅธ ๋‹ต์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ด๋ฏธ ํ™”ํ•ฉ๋ฌผ์ธ 0์„ ์ฐพ์•„๋ƒˆ๋Š”๋ฐ, ๊ณต์ง‘ํ•ฉ์ด ์—†๋‹ค๋ฉด ํˆฌํฌ์ธํ„ฐ๋กœ ํƒ์ƒ‰ํ•  ๋•Œ, ๋‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฐ’์ด ์ ˆ๋Œ€๋กœ 0์ด ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ณต์ง‘ํ•ฉ์„ ํฌํ•จํ•œ ๋ถ€๋ถ„๋ฐฐ์—ด์„ ๊ฐ๊ฐ ๊ตฌ์„ฑํ•œ ๋’ค ๋งˆ์ง€๋ง‰ ์ถœ๋ ฅํ•  ๋•Œ ์ œ์™ธ์‹œ์ผœ์ค๋‹ˆ๋‹ค.
  3. ๊ทธ๋ฆฌ๊ณ  ํˆฌํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ฉ์ด 0์ธ ํ™”ํ•™๋ฌผ์„ ์ฐพ์•„๋‚ผ ํ…๋ฐ, ์ด๋•Œ ๋ฐ˜๋“œ์‹œ ์ •๋ ฌ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

    ์™œ๋ƒํ•˜๋ฉด, ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์ •๋ ฌํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋ฉด ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋‚˜๋ˆ ๋†“์€ ์ด์œ ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.
    → O(N^2)
    ์ •๋ ฌ์„ ํ•ด์•ผ ํˆฌํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ๋‘ ํ•ฉ์ด ๊ธฐ์ค€์  0๋ณด๋‹ค ํด ๋•Œ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๋ฅผ -๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๊ณ , ๊ธฐ์ค€์ ์ธ 0๋ณด๋‹ค ์ž‘์„ ๋•Œ ์™ผ์ชฝ ํฌ์ธํ„ฐ๋ฅผ +๋ฐฉํ–ฅ์œผ๋กœ ํ•œ ์นธ์”ฉ ์›€์ง์—ฌ์„œ ํƒ์ƒ‰์„ ํ•ด์•ผ ํšจ์œจ์ ์ธ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. → O(N)
  4. ์™ผ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์˜ ํ•ฉ์ด 0์ด๋ผ๋ฉด, ํ™ํ˜„์ด๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ํ™”ํ•ฉ๋ฌผ๋กœ ans์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•œ๋‹ค. ์ด๋•Œ count๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

    countํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์— ๊ฐ’์ด num์ธ ์›์†Œ๊ฐ€ ๋ช‡๊ฐœ ์žˆ๋Š”์ง€ ์ฐพ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. upper_bound ๋Š” ๋ฐฐ์—ด์—์„œ num๋ณด๋‹ค ํฐ ๊ฐ’๋“ค ์ค‘ ์ตœ์†Œ์ธ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , lower_bound๋Š” num๋ณด๋‹ค ์ž‘์ง€ ์•Š๋Š” ๊ฐ’๋“ค ์ค‘ ์ตœ์†Œ์ธ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์ฆ‰, (num๋ณด๋‹ค ํฌ๋ฉด์„œ, num๊ณผ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์œ„์น˜ - num์ด ์‹œ์ž‘ํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ์œ„์น˜) ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
    ์ด๋Š” ์ด๋ฏธ ๋ฐฐ์—ด์„ ์ •๋ ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ์ผ์ด๊ณ , num์˜ ๊ฐœ์ˆ˜๋ฅผ ํ—ค์•„๋ฆฌ๋Š”๋ฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

    ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ํฌ์ธํ„ฐ๋“ค์„ ๊ฐ๊ฐ ํ•œ ์นธ์”ฉ ์˜ฎ๊ฒจ ์ค๋‹ˆ๋‹ค.
  5. ๋ชจ๋“  ๋ถ€๋ถ„์ง‘ํ•ฉ์— ๋Œ€ํ•œ ํ•ฉ์„ ํƒ์ƒ‰ํ–ˆ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋‚˜์˜ค๋Š” 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 endint sum, int i) {
    if (idx >= end) {
        v[i].push_back(sum);
        return;
    }
    func(idx + 1end, sum, i);
    func(idx + 1end, 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 / 200);
    func(n / 2, n, 01);
    // ์ •๋ ฌ - ํ•„์ˆ˜
    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 (*+ *== 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(), *- 1);
        }
        else if (*+ *> 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ํ–‰์— ์ž…๋ ฅ๋ฐ›์•˜๋‹ค.
  • ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ํ—ค์•„๋ฆด ๋•Œ ๋น„ํŠธ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚˜๋ˆ ์ง„ ๋ฐฐ์—ด์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๊ตฌํ–ˆ๋‹ค.

 

ํ›„๊ธฐ

์™„์ „ํƒ์ƒ‰์„ ํ•ด์•ผํ•  ๋•Œ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋Š”์ง€ ๋„์ €ํžˆ ์ƒ๊ฐ์ด ์•ˆ๋‚˜์„œ ํ•ด์„ค์„ ํ†ตํ•ด์„œ ๊ณต๋ถ€ํ•œ ๋ฌธ์ œ์ด๋‹ค. ๋‹ค์Œ์— ์ด๋Ÿฐ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚œ๋‹ค๋ฉด ๊ผญ ํ’€ ์ˆ˜ ์žˆ๊ธธ! 

ํˆฌํฌ์ธํ„ฐ๊ฐœ๋…๋„ ๋“ค์–ด๋Š” ๋ดค์—ˆ์ง€๋งŒ ๋ฌธ์ œ์— ์ ์šฉํ•ด๋ณด๋‹ˆ ์‹ ์„ธ๊ณ„์˜€๋‹ค. ์—ญ์‹œ ๊ณต๋ถ€ํ• ๊ฒŒ ๋„ˆ๋ฌด ๋งŽ๋‹ค!

๋Œ“๊ธ€