본문 바로가기

백준

[ 백준 2470 ] 두 용액 (c/c++)

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;
}

 

 

[ 주의할 점 ]

투 포인터 기법을 알고있으면 풀 수 있다.