
https://www.acmicpc.net/problem/2470
[ 문제 요약 ]
N개의 수열이 주어질 때 수열 중 두 수의 합이 0에 가장 가까운 두 수를 출력한다.
[ 문제 풀이 ]
1. 수열을 입력받은 뒤 정렬을 한다.
2. 가장 작은 수와 가장 큰 수를 더한다.
3. 만약 두 수의 합이 0보다 큰 경우 2번째 큰 수로 이동해서 더한다.
4. 만약 두 수의 합이 0보다 작은 경우 2번째 작은 수로 이동해서 더한다.
[ 소스 코드 ]
#include <bits/stdc++.h>
using namespace std;
int N, ans = 2020202020;
int arr[101010], num[2];
int main() {
cin >> N;
for (int i=0; i<N; i++){
cin >> arr[i];
}
sort(arr, arr+N);
int low = 0, high = N-1;
while (low < high){
int sum = arr[low] + arr[high];
if (abs(sum) < ans){
num[0] = arr[low]; num[1] = arr[high];
ans = abs(sum);
}
if (sum > 0) high--;
else if (sum == 0) break;
else low++;
}
cout << num[0] << " " << num[1];
return 0;
}
[ 주의할 점 ]
투 포인터 기법을 알고있으면 풀 수 있다.
'백준' 카테고리의 다른 글
| [ 백준 28449 ] 누가 이길까 (c/c++) (1) | 2024.09.29 |
|---|---|
| [ 백준 17167 ] A Plus Equals B (c/c++) (0) | 2024.09.27 |
| [ 백준 11877 ] 홍수 (c/c++) (1) | 2024.09.25 |
| [ 백준 13018 ] 특이한 수열 (c/c++) (0) | 2024.09.24 |
| [ 백준 15927 ] 회문은 회문아니야!! (c/c++) (0) | 2024.09.23 |