레야몬
[C++] 2473번 세 용액 - 두 포인터 본문
#include <iostream>
#include <algorithm>
#define LOOP(i, N) for(int i=1; i<=N; i++)
#define INF 10000000001
#define MAX_N 5001
using namespace std;
typedef long int lld;
int N; //전체 용액의 수 N
lld num[MAX_N]; //용액의 특성값
lld sum; //용액의 특성값의 합
lld Min, min1, min2, min3; //특성값의 합의 최솟값
void input()
{
cin >> N;
LOOP(i, N) cin >> num[i];
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
input();
sort(num+1, num+N+1); //오름차순 정렬(두 포인터, 이분탐색)
Min=INF; num[0]=num[N+1]=INF;
LOOP(i, N-2) {
lld x = num[i];
int l=i+1, r=N;
while(l < r) {
lld sum=num[l]+num[r]+x;
if(Min > llabs(sum)) {
Min=llabs(sum), min1=x, min2=num[l], min3=num[r];
}
if(sum>0) r--;
else if(sum<0) l++;
else break;
}
}
cout << min1 << ' ' << min2 << ' ' << min3;
return 0;
}
한 점을 잡고 그 점의 특성값으로 나머지 두 점을 투포인터를 이용해 구하면 빠르게 구할 수 있다.
태그에 이분탐색이 있어서 이분탐색을 어거지로 넣어서 풀려고 시도했었는데 이는 속임수였다. 앞으로는 백준 태그를 믿으면 안될 것 같다. 소요 시간이 조금 길어서 마지막에 !sum이면 출력을 하면 좋을 것 같은데 왠지는 모르겠지만 오류가 계속 나서...
※현재 고등학교 등교중인 학생입니다. 이제 알고리즘을 본격적으로 공부하기 시작해서 아직 초보입니다. 혹시 제가 잘못 알고있는 점이나 더 좋은 풀이 방법이 있어 댓글에 남겨주시면 감사히 하나하나 열심히 읽어보겠습니다. 좋아요, 단순한 댓글 한마디라도 저에겐 큰 힘이 됩니다! 감사합니다.
요즘 대학 면접 준비로 많이 바쁩니다. 어떻게든 계속 꾸준히 문제를 풀려고 하고는 있지만 매일은 못 올릴 것 같습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[C++] 7579 앱 - DP, 배낭 문제 (0) | 2022.09.27 |
---|---|
[C++] 2623번 음악프로그램 - 위상 정렬 (0) | 2022.09.27 |
[C++] 2467번 용액 - 두 포인터 (0) | 2022.09.22 |
[C++] 2252번 줄 세우기 - 위상 정렬 (0) | 2022.09.22 |
[C++] 2239번 스도쿠 - 구현, 백트래킹 (0) | 2022.09.22 |
Comments