🖥️ CS/Baekjoon Algorithms

#2470번 두 용액 (C++)

한국의 메타몽 2020. 12. 17. 01:01

링크 : www.acmicpc.net/problem/2470

 

2470번: 두 용액

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

www.acmicpc.net

이 문제에서 주의할 점은 다음과 같다.

1. 음수 값만 입력될 수도 있고, 양수 값만 입력될 수도 있다. 

2. 0에 가까운 수가 정답이고, 여러개의 정답이 있으면 어떤 답을 출력해도 상관없다.

3. 따라서 반드시 0이 나오지 않아도 된다.

 

문제 풀이는 다음과 같다.

1. 기준 값(정답)은 나올 수 있는 값 중 가장 큰 절대값을 갖는 2,000,000,001가 된다. 

(-1,000,000,000이 가능한 가장 큰 음수고 +1,000,000,000이 가능한 가장 큰 양수다.)

1. 값을 모두 입력 받는다. 이때 0번째가 mini, n-1번째가 maxi가 된다.

2. mini가 maxi보다 같거나 크면 탐색은 종료된다. 

3. 배열[mini] + 배열[maxi]의 절대값이 기준 값(정답)보다 작거나 같다면 

해당 값을 기준값으로 바꿔주고, 해당 배열의 값들은 별도로 저장한다.

4. 배열[mini] + 배열[maxi]가 0보다 작다면 mini는 +1해준다. 

5. 반대라면 maxi를 -1해준다. 

 

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n;
    long long ans = 2000000002, temp, mini, maxi, res1, res2;
    vector<long long> arr;
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> temp;
        arr.push_back(temp);
    }
    sort(arr.begin(), arr.end());
    mini =0, maxi = n-1;
    while(mini<maxi){
        temp = arr[mini]+arr[maxi];
        if(abs(temp)<=ans) {
            ans = abs(temp);
            res1 = arr[mini], res2 = arr[maxi];
        }
        if(temp<0) mini++;
        else if(temp>=0) maxi--;
    }
    cout << res1 << " " << res2 << "\n";
    return 0;
}

처음에는 문제를 잘못 읽어 무조건 양수와 음수의 합에서만 정답이 나와야하는 줄 알았고, 

다음으로는 로직을 잘못 이해해 mini<=maxi로 입력해서 수 차례 틀렸다.

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#7682번 틱택토 (C++)  (0) 2021.01.02
#2239번 스도쿠 (C++)  (0) 2020.12.30
#2085번 나무 자르기 (C++)  (0) 2020.12.16
#1707번 이분 그래프 (C++)  (0) 2020.12.09
#14501번 퇴사 (C++)  (2) 2020.12.04