Problem Solving/백준
[BOJ 백준] 2470번 : 두 용액
돌돌김
2020. 10. 3. 21:10
처음에는 산성, 알칼리 용액을 나눠서 계산하다 보니 계속 틀려서 블로그를 참고하여 풀었다.
투 포인터를 활용해서 풀려고 했는데, 풀고나니 이 문제는 절댓값을 활용해서 푸는 것이 더 효율적이라고 생각한다.
기존 접근 방식(오답)
- 산성 용액과 알칼리 용액을 나눠서 저장 후 정렬한다
- 알칼리 용액만 있는 경우, 산성 용액만 있는 경우 각 배열의 첫번째, 두번째 원소의 값이 최솟값이므로, 출력 후 종료한다.
정렬기준을 절댓값으로 한 풀이(정답)
- 산성 용액과 알칼리 용액을 나누지 않고 전부 하나의 배열에 입력 받는다.
- 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;
}