[백준] 2467번: 용액

2022. 9. 12. 12:44TIL💡/Algorithms

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

 

2467번: 용액

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

www.acmicpc.net

보자마자 투포인터로 인식은 했으나 양 포인터를 어떻게 움직일지에 대해 조금 더 고민했던 문제이다.

물론 틀릴 정도로는 어렵지 않다. 휴리스틱하게 생각해봐도 떠올리기 쉬운 기준이다.

 

두 용액의 합이 최대한 0에 가까워야하므로, 왼쪽, 오른쪽 포인터를 비교했을 때 0으로부터 먼 포인터를 안쪽으로 이동시킨다.

 

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main(){
    int n, left = 0, right = 0;
    int result = 2e9;
    cin >> n;
    vector<int> liquid(n);
    for(int i = 0;i < n;i++) {
        cin >> liquid[i];
    }
    
    int lpr = 0;
    int rpr = n - 1;
    while(lpr < rpr) {
        int value = liquid[lpr] + liquid[rpr];
        
        if(abs(value) < result) {
            result = abs(value);
            left = lpr;
            right = rpr;
        }
        
        if(abs(liquid[lpr]) < abs(liquid[rpr])) {
            rpr--;
        }
        else{
            lpr++;
        }
    }
    
    printf("%d %d", liquid[left], liquid[right]);
}

'TIL💡 > Algorithms' 카테고리의 다른 글

[백준] 1927번: 최소 힙  (0) 2022.09.12
[백준] 1976번: 여행 가자  (0) 2022.09.12
[백준] 1446번: 지름길  (0) 2022.09.12
[백준] 1, 2, 3 더하기 4  (0) 2022.09.12
[백준] 5972번: 택배 배송  (0) 2022.09.09