백준 1253
문제)
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
힌트) 두 수 나온다? 포인트 투 포인트 사용하기
sol)
C++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
vector<int> A(N, 0);
// 기본세팅
for (int i = 0; i < N; i++) {
cin >> A[i];
}
//정렬
sort(A.begin(), A.end());
int result = 0;
//포인트 투 포인트 알고리즘
for (int k = 0; k < N; k++) {
long find = A[k];
int i = 0;
int j = N-1;
while (i < j) {
if (A[i] + A[j] == find) {
if (i != k && j != k) {
result++;
break;
}
else if (i == k) {
i++;
}
else if (j == k) {
j--;
}
}
else if (A[i] + A[j] < find) {
i++;
}
else {
j--;
}
}
}
cout << result << endl;
}
sol2)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int arr[2000];
int main() {
int num,result=0,val;
cin>>num;
for(int i=0;i<num;i++)
cin>>arr[i];
sort(arr,arr+num);
for(int i=0;i<num;i++){
val = arr[i]; //찾고자 하는 번호
int l=0,r=num-1,sum;
while(l<r){
sum = arr[l]+arr[r];
if(sum==val){
if(l!=i && r!=i){
result++;
break;
}
else if(l==i) l++;
else if(r==i) r--;
}
else if(sum<val) l++;
else r--;
}
}
cout<<result;
return 0;
}