반응형
문제
풀이
두 포인터를 사용합니다.
먼저 입력을 받아 오름차순으로 정렬합니다.
합이 0에 가까워져야 하므로, 합이 양수일 때는 right를 왼쪽으로 옮겨 합을 감소시키고
합이 음수일 때는 left를 오른쪽으로 이동시켜 합을 증가시킵니다.
합의 절댓값이 최솟값보다 작다면 갱신해주고 target에 저장합니다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n;
cin >> n;
vector<int> v;
vector<int> target;
// 입력
for (int i = 0; i < n; i++) {
int size;
cin >> size;
v.push_back(size);
}
// 정렬
sort(v.begin(), v.end());
int left = 0;
int right = v.size()-1;
int minsum = 2087654321;
// 두포인터
while (right > left) {
int sum = v[left] + v[right];
if (abs(sum) < minsum) {
minsum = abs(sum);
target.clear();
target.push_back(v[left]);
target.push_back(v[right]);
}
// 합이 양수인 경우
if (sum > 0) {
// 0에 가까워지려면 합 감소시켜야함
right--;
}
// 합이 음수인 경우
else {
// 0에 가까워지려면 합 증가시켜야함
left++;
}
}
cout << target[0] << ' ' << target[1];
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 14226] 이모티콘 C++ (0) | 2021.09.26 |
---|---|
[백준 2631] 줄세우기 C++ (0) | 2021.09.25 |
[백준 15686] 치킨 배달 C++ (0) | 2021.09.18 |
[백준 11051] 이항 계수 2 C++ (0) | 2021.09.16 |
[백준 5014] 스타트링크 C++ (0) | 2021.09.16 |