배열
“0x03강 - 배열”
워크북 : 백준 10808, 2577, 1475, 3273

내코도
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <utility>
#define all(x) (x).begin(), (x).end()
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
using namespace std;
int arr[2000002] = {0, };
int n; // 1<=n<=100000
int x; // 1<=x<=2000000
int res;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n; // 9;
int keys[n];
fill (keys, keys + n, 0);
for (int i = 0; i < n; i++) {
cin >> keys[i];
}
cin >> x;
for (int i = 0; i < n; i++) {
if (x > keys[i]) {
if (arr[x - keys[i]])
res++;
}
arr[keys[i]]++;
}
cout << res << endl;
return 0;
}
배열 내에서 합이 13이 되는 두 수를 찾기 위해서 배열을 순회할 때, 예를 들어 예제로 주어진 배열의 5에서는, 8을 확인한다. 해당 수의 짝이 되는(합이 13이 되는) 다른 인덱스의 수를 확인하는 방법은 숙지해두는게 좋은 것 같다. (메모의 “두 포인터”가 이 기술의 대략적인 명칭같다).
짝을 확인하기 위해서, 합인 x에 해당 수인 keys[i]를 빼는데 이때
x - keys[i]
가 음수일 경우,outofBound
에러가 발생하기 때문에x < keys[i]
인 경우, 두 포인터를 체크할 수가 없다. 즉 합이 13인 수를 찾는데 14가 들어오면, 애초에 합이 13이 될 수가 없기 때문에 이런 수들은 짝 포인터를 확인하지 않고 그냥 넘어간다.