레야몬

[C++] 2473번 세 용액 - 두 포인터 본문

알고리즘/백준

[C++] 2473번 세 용액 - 두 포인터

Leyamon 2022. 9. 27. 01:55
#include <iostream>
#include <algorithm>

#define LOOP(i, N) for(int i=1; i<=N; i++)
#define INF 10000000001
#define MAX_N 5001

using namespace std;
typedef long int lld;

int N;  //전체 용액의 수 N
lld num[MAX_N];  //용액의 특성값
lld sum;  //용액의 특성값의 합
lld Min, min1, min2, min3;  //특성값의 합의 최솟값

void input()
{
    cin >> N;
    LOOP(i, N) cin >> num[i];
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    
    input();
    sort(num+1, num+N+1);  //오름차순 정렬(두 포인터, 이분탐색)
    Min=INF; num[0]=num[N+1]=INF;
    
    LOOP(i, N-2) {
        lld x = num[i];
        int l=i+1, r=N;
        while(l < r) {
            lld sum=num[l]+num[r]+x;
            if(Min > llabs(sum)) {
                Min=llabs(sum), min1=x, min2=num[l], min3=num[r];
            }
            if(sum>0) r--;
            else if(sum<0) l++;
            else break;
        }
    }
    cout << min1 << ' ' << min2 << ' ' << min3;
    
    return 0;
}

한 점을 잡고 그 점의 특성값으로 나머지 두 점을 투포인터를 이용해 구하면 빠르게 구할 수 있다.

 

태그에 이분탐색이 있어서 이분탐색을 어거지로 넣어서 풀려고 시도했었는데 이는 속임수였다. 앞으로는 백준 태그를 믿으면 안될 것 같다. 소요 시간이 조금 길어서 마지막에 !sum이면 출력을 하면 좋을 것 같은데 왠지는 모르겠지만 오류가 계속 나서...

 

 

 

 

※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.

 

요즘 대학 면접 준비로 많이 바쁩니다. 어떻게든 계속 꾸준히 문제를 풀려고 하고는 있지만 매일은 못 올릴 것 같습니다.

Comments