[c++] BOJ 1253 :: ์ข‹๋‹ค

๋ฌธ์ œ

์ข‹๋‹ค ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

N๊ฐœ์˜ ์ˆ˜ ์ค‘์—์„œ ์–ด๋–ค ์ˆ˜๊ฐ€ ๋‹ค๋ฅธ ์ˆ˜ ๋‘ ๊ฐœ์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ ์ˆ˜๋ฅผ “์ข‹๋‹ค(GOOD)”๊ณ  ํ•œ๋‹ค.

N๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉด ๊ทธ ์ค‘์—์„œ ์ข‹์€ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ธ์ง€ ์ถœ๋ ฅํ•˜๋ผ.

์ˆ˜์˜ ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ๊ฐ’์ด ๊ฐ™์•„๋„ ๋‹ค๋ฅธ ์ˆ˜์ด๋‹ค.

 

ํ’€์ด

์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•์€ ์ฃผ์–ด์ง„ ์ˆซ์ž๋“ค์„ for๋ฌธ 3์ค‘์œผ๋กœ ๋Œ๋ฉด์„œ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ž…๋ ฅ์ด ํฌ์ง€ ์•Š์•„์„œ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์˜€๊ณ  ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ฐพ์œผ๋ ค๋Š” ์ˆซ์ž๋ณด๋‹ค ์ž‘์€ ์ˆ˜๋“ค๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ ์Œ์ˆ˜๊นŒ์ง€ ๋ฒ”์œ„์— ๋“ค์–ด๊ฐ€๋ฏ€๋กœ target์ด ๋œ ์ˆ˜๋ณด๋‹ค ํฐ ์ˆ˜์— ์Œ์ˆ˜๊ฐ€ ๋”ํ•ด์ ธ์„œ target์ธ ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์–ด์ฐจํ”ผ ์ž…๋ ฅ์ด 10^3 ๋ฐ–์— ๋˜์ง€ ์•Š์œผ๋‹ˆ ์ฃผ์–ด์ง„ ์ˆซ์ž๋“ค ์ค‘ 2๊ฐœ์”ฉ ๊ณจ๋ผ์„œ ๋”ํ•œ ํ•ฉ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋‹ค๋ณด๋ฉด

  1. ๊ฐ™์€ ์ˆซ์ž 2๊ฐœ๋ฅผ ๋”ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  2. ๋ณธ์ธ์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๋Š” ์กฐ๊ฑด์ด ๊ฑธ๋ฆฐ๋‹ค. 1๋ฒˆ์€ for(int i=0; ...){ for(int j= i+1; ...) }๋กœ ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ i, j๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ๋œ๋‹ค.

2๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์—๋Š” 0๊ณผ ๋”ํ•ด์ง€๋Š” ์ˆ˜๋Š” ์ œ์™ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌ๋ฉด 1 0 1์ด๋ผ๋Š” ์ž…๋ ฅ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค. index 0์˜ 1์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด 0๊ณผ index2์˜ 1์ด ๋”ํ•ด์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ, 0์ด ๋”ํ•ด์ง„๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ œ์™ธํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ์ž…๋ ฅ์—์„œ์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ 0์ด ๋˜๋ฏ€๋กœ ํ‹€๋ฆฐ๋‹ค.

๊ฒฐ๊ตญ ์ฃผ์–ด์ง„ ์ˆซ์ž๋“ค(numbers) ์ค‘ ํŠน์ • ์ˆซ์ž(numbers[i])๊ฐ€ ๋‘ ์ˆ˜์˜ ํ•ฉ์œผ๋กœ ํ‘œํ˜„๋˜๋Š” ์ง€ ๋ณด๋ ค๋ฉด, ๊ธฐ์กด์— ์ €์žฅํ•ด๋‘” ํ•ฉ ๋ชจ์Œ(sum) ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ˆซ์ž๋ฅผ ๋งŒ๋“  ์š”์†Œ ์ค‘ i๋ฒˆ์งธ ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ์ง€๊นŒ์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด sum์— ์ˆซ์ž๋ฅผ ๋งŒ๋“  ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•˜๋Š” ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์ฒ˜์Œ numbers ๋“ค์„ ๋ฐ›์„ ๋•Œ sum์— ๋ฏธ๋ฆฌ i๋ผ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ ์–ด๋‘๋ฉด ๋œ๋‹ค. 1 0 1์˜ ๊ฒฝ์šฐ 1์ด index 0๊ณผ 2์—์„œ ๋‚˜ํƒ€๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์— sum[1] = 0 ๋„ ๋˜๊ณ  sum[1] = 2๋„ ๋œ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ๋กœ ์ง„ํ–‰๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๋‚˜์ค‘์— index 0์˜ 1์„ ๋งŒ๋“œ๋Š” ๋‹ค๋ฅธ ๋‘ ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ, index 2๊ฐ€ sum[1]์— ๋“ฑ๋ก๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ index 0์ด sum[1]์— ๋“ฑ๋ก๋˜์–ด์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ index 0๊ณผ index 1์˜ ์กฐํ•ฉ์œผ๋กœ ํ•ด๋‹น ์ˆซ์ž๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ข‹์€ ์ˆ˜๋กœ ํŒ๋ช…๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ™์€ ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋”๋ผ๋„ ํ•˜๋‚˜์˜ index๋งŒ ๋“ฑ๋ก๋˜์–ด์žˆ์œผ๋ฉด ์ œ๋Œ€๋กœ ๋‹ต์ด ๊ตฌํ•ด์ง„๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

3
0 0 0
// ๋‹ต : 3

3
1 0 1
// ๋‹ต : 2

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

int main() {
    ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL);
    // ์Œ์˜ ์ •์ˆ˜๋„ ๊ฐ€๋Šฅ

    int N; cin >> N;
    vector<int> numbers;
    map<int, pair<bool, int>> sum; // ํ•ฉ, ์ข‹์€ ์ˆ˜ ์—ฌ๋ถ€, ์ž๊ธฐ์ž์‹ ์˜ idx (idx๊ฐ€ ๋‘ ๊ฐœ ์ด์ƒ์ด๋ฉด ์–ด์ฐจํ”ผ ํ•˜๋‚˜๋Š” ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜์–ด์žˆ์Œ)
    // ์ข‹์€ ์ˆ˜ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•ด๋†”์•ผ find๋ฅผ ์•ˆ ์“ฐ๊ณ  ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Œ

    for (int i = 0; i < N; i++) {
        int tmp; cin >> tmp;
        numbers.push_back(tmp);
        sum[tmp] = { false, i };
    }

    if (numbers.size() < 3) {
        cout << 0;
        return 0;
    }

    for (int i = 0; i < numbers.size(); i++) { // ๊ฐ™์€ ์ˆ˜ 2๊ฐœ ์ œ์™ธ
        for (int j = i + 1; j < numbers.size(); j++) {
            int total = numbers[i] + numbers[j];

            if (!sum.count(total)) continue; // ์—†์œผ๋ฉด ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค. => ์ด๋ฏธ ์žˆ์œผ๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๊ธฐ
            if ((sum[total].second == i) || (sum[total].second == j)) continue; // ์ž๊ธฐ ์ž์‹  ์ œ์™ธ

            mine[total].first = true;
        }
    }

    int result = 0;
    for (int i = 0; i < numbers.size(); i++) {
        if (sum[numbers[i]].first) {
            result++;
        }
    }

    cout << result << '\n';
}
๋ฐ˜์‘ํ˜•

'Algorithm ๋ฌธ์ œ > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[c++] BOJ 7579 :: ์•ฑ  (0) 2021.10.10
[c++] BOJ 1501 :: ์˜์–ด ์ฝ๊ธฐ  (0) 2021.10.07
[c++] BOJ 4195 :: ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ  (0) 2021.09.28
[c++] BOJ 5430 :: AC  (0) 2021.09.07
[c++] BOJ 14725 :: ๊ฐœ๋ฏธ๊ตด  (0) 2021.09.07