Problem Solving/백준

[BOJ 백준] 2470번 : 두 용액

돌돌김 2020. 10. 3. 21:10

www.acmicpc.net/problem/2470

 

2470번: 두 용액

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

www.acmicpc.net

 

처음에는 산성, 알칼리 용액을 나눠서 계산하다 보니 계속 틀려서 블로그를 참고하여 풀었다.

 

투 포인터를 활용해서 풀려고 했는데, 풀고나니 이 문제는 절댓값을 활용해서 푸는 것이 더 효율적이라고 생각한다.

 

 

 

 

기존 접근 방식(오답)
  • 산성 용액과 알칼리 용액을 나눠서 저장 후 정렬한다
  • 알칼리 용액만 있는 경우, 산성 용액만 있는 경우 각 배열의 첫번째, 두번째 원소의 값이 최솟값이므로, 출력 후 종료한다.

 

 

정렬기준을 절댓값으로 한 풀이(정답)
  • 산성 용액과 알칼리 용액을 나누지 않고 전부 하나의 배열에 입력 받는다.
  • sort함수로 정렬한다. 단, 절댓값으로 정렬할 수 있도록 비교함수는 따로 만든다.

 

소스코드
#include<bits/stdc++.h>
#define endl "\n"
#define MAX 10
using namespace std;
int n, tmp, idx_left, idx_right;
int sum = 2000000000;
vector<int>v;
bool cmp(int a, int b){
    return abs(a) < abs(b);
}
int main() {	
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	//freopen("input.txt", "r", stdin);
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>tmp;
        v.push_back(tmp);
    }
    sort(v.begin(), v.end(), cmp); // 절댓값을 기준으로 정렬
    
    for(int i=0; i<n-1; i++){
        int res = v[i]+v[i+1];
        if(abs(res)<abs(sum)){
            sum = res;
            idx_left=v[i];
            idx_right=v[i+1];
        }
    } 
    if(idx_left>idx_right){
        swap(idx_left, idx_right);
    }
    cout<<idx_left<<' '<<idx_right;

	return 0;
}