Koala - 11기/코딩테스트 준비 스터디

[백준/C++] 2467번: 용액

나는 푸딩 2023. 7. 28. 14:06

Problem


Solution


1) 변수 및 배열 선언 및 입력 받기

2) 두 개의 포인터를 사용하여 합이 0에 가까운 두 수를 찾기

두 개의 포인터 'left'와 'right'를 배열의 양 끝으로 초기화하고 합이 0에 가까운 두 수를 찾기 위해 'left' 포인터와 ' right' 포인터를 이동시키면서 최적의 값을 찾는다.

반복문은 'left'와 'right'가 같아질 때까지 계속 실행된다. 최솟값을 저장하는 'minVal'을 갱신하면서, 합이 0에 더 가까워질 때마다 그 때의 두 수를 'ans'에 저장한다.

3) 'ans' 벡터에 저장된 두 수를 출력한다.

Answer


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

using namespace std;

int main() {
    int n;
    cin >> n;

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

    int left = 0, right = n - 1;
    int minVal = abs(li[left] + li[right]);
    vector<int> ans = {li[left], li[right]};

    while (left != right) {
        if (minVal > abs(li[left] + li[right])) { 
            minVal = abs(li[left] + li[right]);
            ans = {li[left], li[right]};
        }

        if (li[left] + li[right] >= 0) {
            right--;
        } else if (li[left] + li[right] < 0) {
            left++;
        }
    }

    for (int i : ans) {
        cout << i << " ";
    }

    return 0;
}

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