알고리즘

BOJ 2467: 용액 (C++)

namaskar 2025. 1. 26. 22:28
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

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

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

    int left = 0, right = N - 1;
    int closestSum = 2'000'000'000; // 초기화 (문제 조건에서 절대 나올 수 없는 큰 값)
    int answerLeft = 0, answerRight = 0;

    while (left < right) {
        int sum = arr[left] + arr[right];

        // 현재 합이 0에 더 가까우면 갱신
        if (abs(sum) < abs(closestSum)) {
            closestSum = sum;
            answerLeft = arr[left];
            answerRight = arr[right];
        }

        // 합이 0보다 작으면 left를 오른쪽으로 이동
        if (sum < 0) {
            left++;
        } 
        // 합이 0보다 크면 right를 왼쪽으로 이동
        else {
            right--;
        }
    }

    // 결과 출력
    cout << answerLeft << " " << answerRight << endl;

    return 0;
}

투포인터 문제로, left, right의 두개의 포인터를 사용한다.

양 끝으로 투 포인터 각각을 초기화하고, 합 계산 및 최적화 탐색을 수행하면 된다. 

'알고리즘' 카테고리의 다른 글

BOJ 2240: 자두나무 (c++)  (0) 2025.03.30
BOJ 4963: 섬의 개수 (c++)  (0) 2025.02.16
BOJ 1995: 필터 (C++)  (0) 2025.01.12