[๋ฐฑ์ค/C++] 1253. ์ข๋ค
๋ฌธ์
https://www.acmicpc.net/problem/1253
1253๋ฒ: ์ข๋ค
์ฒซ์งธ ์ค์๋ ์์ ๊ฐ์ N(1 ≤ N ≤ 2,000), ๋ ๋ฒ์งธ ์ค์๋ i๋ฒ์งธ ์๋ฅผ ๋ํ๋ด๋ Ai๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. (|Ai| ≤ 1,000,000,000, Ai๋ ์ ์)
www.acmicpc.net
N๊ฐ์ ์ ์ค์์ ์ด๋ค ์๊ฐ ๋ค๋ฅธ ์ ๋ ๊ฐ์ ํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋ค๋ฉด ๊ทธ ์๋ฅผ “์ข๋ค(GOOD)”๊ณ ํ๋ค.
N๊ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ฉด ๊ทธ ์ค์์ ์ข์ ์์ ๊ฐ์๋ ๋ช ๊ฐ์ธ์ง ์ถ๋ ฅํ๋ผ.
์์ ์์น๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ด ๊ฐ์๋ ๋ค๋ฅธ ์์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ์์ ๊ฐ์ N(1 ≤ N ≤ 2,000), ๋ ๋ฒ์งธ ์ค์๋ i๋ฒ์งธ ์๋ฅผ ๋ํ๋ด๋ Ai๊ฐ N๊ฐ ์ฃผ์ด์ง๋ค. (|Ai| ≤ 1,000,000,000, Ai๋ ์ ์)
์ถ๋ ฅ
์ข์ ์์ ๊ฐ์๋ฅผ ์ฒซ ๋ฒ์งธ ์ค์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ
10
1 2 3 4 5 6 7 8 9 10
์์ ์ถ๋ ฅ
8
ํ์ด
1. ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
2. idxs<์ซ์, ์ธ๋ฑ์ค>, counts<์ซ์, ๋ฑ์ฅ ํ์>, isGood<์ซ์, ์ข์์ซ์ ์ฌ๋ถ> map์ ๋ง๋ ๋ค.
- counts : ๊ฐ์ ์ซ์๊ฐ ์ฌ๋ฌ๋ฒ ๋ฑ์ฅํ์ ๊ฒฝ์ฐ๋ฅผ ์ํด
- isGood : ํ ๋ฒ ์ข์์ซ์๊ฐ ๋ ์ดํ๋ก ์ค๋ณต์ผ๋ก ์ธ์ด์ฃผ์ง ์๊ธฐ ์ํด
3. ์ด์คํฌ๋ฌธ์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด์ ๋๋ฉด์ ๋ ์์ ํฉ(temp)์ ๊ตฌํ๋ค.
3-1. ๋ ์์ ํฉ์ด ์ฃผ์ด์ง ๋ฐฐ์ด์ ์กด์ฌํ๊ณ , ์ด์ ์ ์ข์์ซ์๊ฐ ๋ ์ ์ด ์์ผ๋ฉด, ์ข์ ์ซ์์ ๊ฐ์๋ฅผ counts[temp] ๋งํผ ๋๋ ค์ค๋ค.
- ์๊ฐ๋ณต์ก๋๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์ค์ด๊ธฐ ์ํด ์ด์ค ํฌ๋ฌธ์ 0~N, 0~N์ผ๋ก ๋๋ฆฌ์ง ์๊ณ 0~N, i~N์ผ๋ก ๋๋ ธ๋ค. ๊ทธ๋์ ์ด๋ฅผ ์ํด ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ๋ ฌํด์คฌ๋๋ฐ, ์ ๋ ฌ์ ํ์ง ์๊ณ ์ ์ถ์ ํด๋ ์ ๋ต์ด ๋์ด์ ์์ํ๋ค.
- ๋ฌธ์ ์ ๋ช ์๋์ด ์์ง๋ ์์ง๋ง ์ซ์๊ฐ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฅ๋๋ ๋ชจ์์ด๋ค.
์ฝ๋
#include <map>
#include <vector>
#include <algorithm>
#include <iostream>
#define endl '\n'
using namespace std;
int N;
vector<int> nums;
map<int, int> idxs; // <์ซ์, ์ธ๋ฑ์ค>
map<int, int> counts; // <์ซ์, ๋ฑ์ฅ ํ์>
map<int, bool> isGood;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL);
cin >> N;
int input;
for (int n = 0;n < N;n++) {
cin >> input; nums.push_back(input);
}
//sort(nums.begin(), nums.end()); // ??
for (int n = 0;n < N;n++) {
idxs[nums[n]] = n;
counts[nums[n]]++;
isGood[nums[n]] = 0;
}
int result = 0;
for (int i = 0;i < N;i++) {
for (int j = i + 1;j < N;j++) {
int temp = nums[i] + nums[j];
//nums์์ ์ด ๊ฐ๊ณผ ๊ฐ์๊ฒ์ด ์๋์ง ํ์ธ
if (idxs.count(temp) && !isGood[temp]) {
//์ธ๋ฑ์ค๊ฐ ๋ค๋ฅธ์ง ํ์ธ
if (idxs[temp] != i && idxs[temp] != j) {
result += counts[temp];
isGood[temp] = 1;
}
}
}
}
cout << result << endl;
return 0;
}