본문 바로가기

Coding Test

백준 2467 용액

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

 

2467번: 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -

www.acmicpc.net

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



using namespace std;




int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;
    pair<int, int> ans;


    cin >> n;
    vector<int> liq(n);

    for (int i = 0; i < n; i++) {
        cin >> liq[i];
    }


    int s = 0;
    int e = n - 1;


    ans = {liq[s], liq[e]};

    while (s < e) {

        ans = abs(ans.first + ans.second) > abs(liq[s] + liq[e]) ? make_pair(liq[s], liq[e]) : ans;

        if (ans.first + ans.second == 0) {
            break;
        }

        if (liq[s] + liq[e] < 0) {
            s++;
        } else {
            e--;
        }
    }

    cout << ans.first << " " << ans.second;

    return 0;
}

 

두 수의 합이 0에 가깝다는 건 합의 절댓값이 최소여야 한다는 뜻을 의미한다.

정렬된 용액이 주어지므로 양쪽 끝을 포인터로 잡고 연산을 수행한다.

  두 용액의 합이 음수일 때: 왼쪽 포인터를 옮겨 음수의 영향을 줄인다.

  두 용액의 합이 양수일 때: 오른쪽 포인터를 옮겨 양수의 영향을 줄인다.

위 과정을 수행하면서 처음보다 두 포인터가 가리키고 있는 용액의 합의 절댓값이 최소가 될 경우, 정답의 용액을 갱신한다.

'Coding Test' 카테고리의 다른 글

백준 2512 예산  (0) 2024.04.02
백준 15657 N과 M(8)  (1) 2024.04.01
백준 5639 이진 검색 트리  (1) 2024.03.31
백준 9342 염색체  (0) 2024.03.29
백준 15685 드래곤 커브  (0) 2024.03.28