https://www.acmicpc.net/problem/2473
목적
용액의 특성값들이 N개 주어질 때, 3가지의 특성값을 더해 절대값이 0에 가장 가까운 용액의 특성값들을 구하자.
접근법
첫 번째 용액이 정해진 상태라면, 나머지 두 개의 용액을 선택하여 절대값이 0에 가깝도록 하는 것은 투 포인터 알고리즘으로 구할 수 있다. (투포인터 알고리즘에 대한 설명은 다음 글 참조 [백준 2470 - 두 용액])
첫 번째 용액으로 선택할 수 있는 용액의 수는 총 N-2개이며, 이 용액의 특성값을 더하여 절대값이 0에 가까운 값을 만들기 위한 나머지 두 개의 용액만 구하면 된다.
#include<bits/stdc++.h>
#define f(i,l,r) for(int i=l;i<r;++i)
#define fr(i,l,r) for(int i=l;i>=r;--i)
using namespace std;
typedef long long ll;
int n,a[5000],s[3];
void sol(){
ll mn=3e9;
fr(i,n-3,0){
int l=i+1,r=n-1;
while(l<r){
ll sum=(ll)a[i]+a[l]+a[r],tmp=abs(sum);
if(mn>tmp)s[0]=i,s[1]=l,s[2]=r,mn=tmp;
if(!sum)return;
sum>0?--r:++l;
}
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin>>n;
f(i,0,n)cin>>a[i];
sort(a,a+n);
sol();
f(i,0,3)cout<<a[s[i]]<<' ';
return 0;
}
문제 설명과 코드에 대한 피드백은 언제나 환영합니다.
다양한 의견 댓글로 남겨주세요.
'Problem Solving > BOJ 백준' 카테고리의 다른 글
[ BOJ 백준 1126번 - 같은 탑] 해설 및 코드 (0) | 2020.06.29 |
---|---|
[ BOJ 백준 2470번 - 두 용액 ] 해설 및 코드 (0) | 2020.04.16 |
[ BOJ 백준 17780번 - 새로운 게임 ] 해설 및 코드 (0) | 2020.04.12 |
[ BOJ 백준 1328번 - 고층 빌딩 ] 해설 및 코드 (6) | 2020.04.07 |
[ BOJ 백준 13398번 - 연속합 2 ] 해설 및 코드 (0) | 2020.03.30 |