input은 최대 10억 최소 -10억의 정수값으로 10만개 이하가 들어온다. int로 처리할 수 있으며 투포인터로 처리하기 전에 이분탐색으로 풀었는데 투 포인터가 더 쉬운 것 같다.
생각해보면 정렬한 후에 각 용액에 대한 페어를 찾아내면서 최소값을 찾는다는 그리디함이 보장되는 문제였다.
이분탐색 풀이 링크: https://readble-ko.tistory.com/148
#include <bits/stdc++.h>
using namespace std ;
int N ;
class Best //합이 가장 적은 경우를 best 클래스에 저장했다.
{
public:
int val = 2e9 ; //최대 + 최대 case를 생각해 20억으로 맞춰주었다.
int first = 0 ;
int second = 0 ;
};
int main()
{
ios::sync_with_stdio(0), cin.tie(0) ;
cin >> N ;
vector<int> liquid(N) ;
for(int &it: liquid)
cin >> it ;
sort(liquid.begin(), liquid.end()) ;
int sp = 0, ep = N - 1 ; //sp:starting point ep:end point
Best best ;
while(sp < ep)
{
int local_min = liquid[sp] + liquid[ep] ;
if(abs(best.val) > abs(local_min))
{
best.val = local_min ;
best.first = liquid[sp] ;
best.second = liquid[ep] ;
}
if(local_min == 0) break ;
local_min < 0 ? sp++ : ep-- ;
}
cout << best.first << " " << best.second << "\n" ;
}
느낀점: 처음에 어떤 알고리즘으로 풀어낼 지 잘 고민하고 생각해야하는 것 같다. 문제가 2배로 쉬워졌다.
문제링크: https://www.acmicpc.net/problem/2467
'Problem Solving > 백준' 카테고리의 다른 글
[백준/C++] 19539번 사과나무 풀이 (0) | 2023.03.24 |
---|---|
[백준/C++/KOI] 2470번 두 용액 이분탐색 풀이 (0) | 2023.03.23 |
[백준/C++] 19238번 스타트 택시 풀이 (0) | 2023.03.20 |
[백준/C++] 17138번 캐슬 디펜스 풀이 (2) | 2023.03.08 |
[백준/C++] 1043번 거짓말 BFS 풀이 (0) | 2023.03.02 |