카테고리 없음

[백준] #2470 두 용액

jHoon0223 2021. 9. 29. 14:45

https://www.acmicpc.net/problem/2470

 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

 

알고리즘 분류는 이진탐색으로 되어있지만, 그냥 투포인트 방식으로도 풀리는 문제였다. 오히려 그게 시간 효율이 더 좋을수도..?


  • 풀이

알고리즘은 간단하다. int형 벡터에 숫자를 입력받아서 오름차순로 정렬해주고, 왼쪽 끝과 오른쪽 끝 이렇게 두 포인터를 이동시키며 가장 0에 가까운 값이 될때까지 포인터들을 갱신해주면 된다.


  • 구현
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int toAbsoluteValue(int a) {
    if (a < 0) return -a;
    return a;
}

int main(void) {
    int N;
    cin >> N;

    vector<int> v;
    for (int i = 0; i < N; i++) {
        int a;
        cin >> a;
        v.push_back(a);
    }
    sort(v.begin(), v.end());

    int left = 0, right = N-1, total = v[left] + v[right];
    int tmpL = 0, tmpR = N-1, tmpTotal;

    while (tmpL < tmpR) {
        tmpTotal = v[tmpL] + v[tmpR];

        if (toAbsoluteValue(tmpTotal) < toAbsoluteValue(total)) {
            total = tmpTotal;
            left = tmpL;
            right = tmpR;
        }

        if (tmpTotal <= 0) tmpL++;
        else tmpR--;
    }
    cout << v[left] << " " << v[right];

    return 0;
}

728x90