[BOJ] 2473번 : 세 용액

김영한·2021년 3월 5일
0

알고리즘

목록 보기
14/74

문제 링크 : 백준 2473번

[문제 접근]

투 포인터로 풀었던 두 용액의 심화버전??인 것같다.
3개의 용액이므로 i를 0~n-2까지 돌리면서 처음 용액을 고정시켜주고 left = i+1, right = n-1로 설정하고 나머지 2용액을 투 포인터로 탐색해주면 된다.

[소스 코드]

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int n;
vector<long long> arr;
long long ans[3];
bool check;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for(int i=0 ; i<n ; i++) {
        long long a;
        cin >> a;
        arr.push_back(a);
    }
    sort(arr.begin(), arr.end());
    long long cnt=0;
    for(int i=0 ; i<n-2 ; i++) {
        long long left = i+1, right = n-1;

        while(left<right) {
            long long sum = arr[i] + arr[left] + arr[right];
            if(!check || (abs(cnt)>abs(sum))) {
                check = true;
                cnt = sum;
                ans[0] = arr[i];
                ans[1] = arr[left];
                ans[2] = arr[right];
            }
            if(sum>0) right--;
            else if(sum<0) left++;
            else {
                sort(ans, ans+3);
                for(int i=0 ; i<3 ; i++) {
                    cout << ans[i] << " ";
                }
                exit(0);
            }
        }
    }

    sort(ans, ans+3);
    for(int i=0 ; i<3 ; i++) {
        cout << ans[i] << " ";
    }
    return 0;
}

0개의 댓글