[백준] 3273번 두 수의 합 (배열, 포인터 c++)
728x90
반응형
https://www.acmicpc.net/problem/3273
두 가지 방법으로 풀 수 있다.
하나는 원소 체크(기록)을 해서 배열의 원소 a에 대해서 x-a가 배열에 있는 지 체크하는 법
또 하나는 정렬 후 투포인터를 이용하는 법.
1. 기록
#include <iostream>
using namespace std;
int num[100001];
int cnt[2000001];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n,tmp,x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> tmp;
num[i]=tmp;
cnt[tmp] = 1;
}
cin >> x;
int sum = 0;
for (int i = 0; i < n; i++) {
// x-num[i]가 음수면 런타임에러나므로 조심
if (x-num[i]>=0 && cnt[x - num[i]] != 0 && x-num[i]>num[i]) {//i<j조건도 넣어준다.
sum += 1;
}
}
cout << sum;
return 0;
}
2. 투포인터 방법
정렬 후 가장 작은 수(left)와 큰수(right)를 더해가면서 가능한 쌍의 개수를 본다.
#include <iostream>
using namespace std;
int num[100001];
int main(void) {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n,tmp,x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> num[i];
}
cin >> x;
sort(num, num + n);
int sum = 0;
int left = 0, right = n - 1;
while (left < right) {
if (num[left] + num[right] == x) {
sum += 1;
left += 1;
right -= 1;
}
else if (num[left] + num[right] > x) {
right -= 1;
}
else {
left += 1;
}
}
cout << sum;
return 0;
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 6198번 옥상 정원 꾸미기 (stack, c++) (0) | 2021.10.05 |
---|---|
[백준] 5397번 키로거 (리스트, c++) (0) | 2021.09.27 |
[백준] 1919번 애너그램 만들기 (배열, C++) (0) | 2021.09.24 |
1475번 방번호 (C++) (0) | 2021.09.24 |
[백준] 17298번 오큰수 (java, 스택) (0) | 2021.05.04 |
TAGS.