본문 바로가기
Problem Solving

[Problem Solving] BOJ 2473 : 세 용액

by __K.Jun__ 2024. 7. 6.

문제 링크 : https://www.acmicpc.net/problem/2473

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <algorithm>
#define endl '\n'
using namespace std;

long long N;
vector<long long> v;
vector<long long> answer(3);
long long minVal = 3000000001;

void input()
{
    cin >> N;
    for (long long i = 0; i < N; i++)
    {
        long long num;
        cin >> num;
        v.push_back(num);
    }
    sort(v.begin(), v.end());
}

void solve()
{
    for (long long i = 0; i <= N - 3; i++)
    {
        long long left = i + 1;
        long long right = N - 1;
        while (left < right)
        {
            long long sum = v[i] + v[left] + v[right];
            if (minVal > abs(sum))
            {
                answer[0] = v[i];
                answer[1] = v[left];
                answer[2] = v[right];
                minVal = abs(sum);
            }
            if (sum > 0)
                --right;
            else
                ++left;
        }
    }
}

void output()
{
    sort(answer.begin(), answer.end());
    for (auto i : answer)
        cout << i << " ";
    cout << endl;
}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    input();
    solve();
    output();
    return 0;
}

1. 입력 받은 용액을 오름차순 정렬한다.

2. i 번째 용액과 i 번째 용액보다 큰 두 용액의 조합 중 절댓값이 가장 작은 조합을 찾아서 answer에 저장한다. (0 <= i <= N - 3)

3. answer를 정렬하여 오름차순으로 출력한다.

728x90