백준 2470 두 용액 / C++

이유참치·2025년 12월 15일

백준

목록 보기
74/248

문제 : 2470

풀이 point

정렬과 투포인터를 활용해 문제를 풀 수 있다.
min보다 작으면 특성 값이 0에 가까우므로 교체해준다.
0보다 큰 경우와 0보다 작은 경우를 나누어서 투포인터를 구현한다.

풀이 방법

받은 값들을 정렬한다.
0보다 크면 뒤의 인덱스를 땡긴다.
0보다 작으면 앞의 인덱스를 땡긴다.
(보다 0과 가까워져야하기 때문)
0과 같으면 멈춘다.(가장 최적이기 때문)

ex) -99 -2 -1 4 98
1) -99 + 98 = -1(최소)
2) -2 + 98 = 97(0보다 작아서 앞에꺼 땡김, 최소 갱신x)
3) -2 + 4 = 2(0보다 커서 뒤에꺼 땡김, 최소 갱신x)
4) -2 -1 = -3(0보다 작아서 앞에꺼 땡김, 최소 갱신x)

코드

//백준 2470, 두 용액

#include <iostream>
#include <climits>
#include <algorithm>

int value[100'001];

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

    for(int i{0}; i<N; ++i){
        std::cin >> value[i];
    }

    std::sort(value, value+N);

    int i{0}; int j{N-1};
    int one{0}; int two{0};
    int min{INT_MAX};

    while(i < j){
        if(abs(value[i] + value[j]) < min){
            one = value[i];
            two = value[j];
            min = abs(value[i] + value[j]);
        }
        if(value[i]+value[j] == 0) break;
        if(value[i]+value[j] > 0) --j;
        else if(value[i] + value[j] < 0) ++i;
    }

    std::cout << one << ' ' << two;

    return 0;
}
profile
임아리 - 대학생

0개의 댓글