https://www.acmicpc.net/problem/1940
고유번호를 가진 재료 n개가 주어지고 이것 중 2개를 합해서 m을 만들 수 있는 경우의 수를 구하는 문제다.
정렬과 투포인터를 이용해서 풀면 된다.
v[start](0에서부터 시작한 인덱스값)+v[end](뒤에서부터 시작한 인덱스값)
1. m이면 cnt++
2. m보다 작으면 start++
3. m보다 크면 end--
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n, m;
vector<int> v;
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
int a;
cin >> a;
v.push_back(a);
}
sort(v.begin(), v.end());
int start = 0, end = n - 1, cnt = 0;
while (end > start)
{
if (v[start] + v[end] == m)
{
cnt++;
start++;
end--;
}
else if (v[start] + v[end] > m)
{
end--;
}
if (v[start] + v[end] < m)
{
start++;
}
}
cout << cnt << "\n";
}
투포인ㅌㅓ 만세