알고리즘/백준

[백준 2470] 두 용액 C++

겜도리도리 2021. 9. 25. 01:04
반응형

문제

백준 2470

 

2470번: 두 용액

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

www.acmicpc.net

풀이

두 포인터를 사용합니다.

먼저 입력을 받아 오름차순으로 정렬합니다.

합이 0에 가까워져야 하므로, 합이 양수일 때는 right를 왼쪽으로 옮겨 합을 감소시키고

합이 음수일 때는 left를 오른쪽으로 이동시켜 합을 증가시킵니다.

합의 절댓값이 최솟값보다 작다면 갱신해주고 target에 저장합니다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int n;
    cin >> n;
    vector<int> v;
    vector<int> target;
    // 입력
    for (int i = 0; i < n; i++) {
        int size;
        cin >> size;
        v.push_back(size);
    }
    // 정렬
    sort(v.begin(), v.end());
    int left = 0;
    int right = v.size()-1;
    int minsum = 2087654321;
    // 두포인터
    while (right > left) {
        int sum = v[left] + v[right];
        if (abs(sum) < minsum) {
            minsum = abs(sum);
            target.clear();
            target.push_back(v[left]);
            target.push_back(v[right]);
        }
        // 합이 양수인 경우
        if (sum > 0) {
            // 0에 가까워지려면 합 감소시켜야함
            right--;
        }
        // 합이 음수인 경우
        else {
            // 0에 가까워지려면 합 증가시켜야함
            left++;
        }
    }
 
    cout << target[0<< ' ' << target[1];
    return 0;
}
cs
반응형

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

[백준 14226] 이모티콘 C++  (0) 2021.09.26
[백준 2631] 줄세우기 C++  (0) 2021.09.25
[백준 15686] 치킨 배달 C++  (0) 2021.09.18
[백준 11051] 이항 계수 2 C++  (0) 2021.09.16
[백준 5014] 스타트링크 C++  (0) 2021.09.16