어흥

[백준 2473] 세 용액 (C++) 본문

알고리즘/백준

[백준 2473] 세 용액 (C++)

라이언납시오 2021. 2. 24. 18:12
728x90
반응형

문제 링크: www.acmicpc.net/problem/2473

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

1. 주의할 점

- 세 포인터가 아닌 1개 고정 + 두 포인터를 이용해 해결한다

- 포인터가 겹칠 수 없다

- 정답을 오름차순으로 출력한다

 

2. 구현

- 모든 수를 Arr[] 배열에 받은 후, 오름차순으로 정렬한다

- Result를 3000000001로 설정하여 이보다 0에 가까운 값을 가질 경우, Ans[] 배열과 Result값을 갱신하도록 한다

- 가장 왼쪽의 포인터 K를 고정시킨 후, L과 R을 통해 K+1~Num-1까지의 Arr[] 배열 원소를 두포인터를 이용하여 양끝에서 안쪽으로 탐색한다

- 만약 전체 합이 0보다 작으면 더 큰 값을 더하면 되므로 왼쪽 포인터인 L을 ++한다

- 그 외의 경우에는 더 작은 값을 더하면 되므로 오른쪽 포인터인 R을 --한다

#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
long long arr[5000];
long long ans[3];

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int num;
    long long result = 3000000001;
    cin>>num;
    for(int i=0;i<num;i++)
        cin>>arr[i];
    sort(arr,arr+num);
    for(int k=0;k<num-2;k++){
        int l=k+1,r=num-1;
        while(l<r){
            long long val = arr[k]+arr[l]+arr[r];
            if(abs(val) < result){
                result = abs(val);
                ans[0] = arr[k];
                ans[1] = arr[l];
                ans[2] = arr[r];
                //처리
            }
            if(val<0) l++;
            else r--;
        }
    }
    for(int i=0;i<3;i++)
        cout << ans[i]<<" ";
    return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 3649] 로봇 프로젝트 (C++)  (0) 2021.02.25
[백준 2586] 전깃줄 - 2 (C++)  (0) 2021.02.24
[백준 1365] 꼬인 전깃줄 (C++)  (0) 2021.02.24
[백준 8983] 사냥꾼 (C++)  (0) 2021.02.23
[백준 2352] 반도체 설계 (C++)  (0) 2021.02.23
Comments