반응형
https://www.acmicpc.net/problem/2467
two pointer문제였습니다.
풀이방법
1. l = 0, r = n-1로 시작해 두 용액의 합을 찾습니다.
2. 두 용액의 합에 대해 절댓값이 더 작다면 현재 합을 갱신해줍니다. 그리고 정답에 대한 index 또한 갱신해줍니다.
3. 현재 l과 r의 값 합이 0이면 loop를 탈출, 양수라면 양수가 있을 확률이 있는 r을 --, 음수라면 더 큰 값을 더해야하므로 l을 ++해주면서 원하는 값을 찾습니다.
*자기 자신은 더하면 안되므로 while문은 l < r인 동안만 수행해야합니다.
Code
#include <bits/stdc++.h>
using namespace std;
int n;
int liquid[100001];
void twoPointer(){
int l = 0, r = n - 1;
int a,b;
int sum = INT_MAX;
while(l<r){
int tmpSum = liquid[l] + liquid[r];
if(abs(sum) > abs(tmpSum)) {
sum = tmpSum;
a = liquid[l];
b = liquid[r];
}
if(tmpSum == 0) break;
else if(tmpSum > 0) r--;
else l++;
}
cout << a << ' ' << b;
}
int main(){
cin >> n;
for(int i = 0; i < n; i++) cin >> liquid[i];
twoPointer();
}
'Algorithm > Sweeping' 카테고리의 다른 글
(C++) - 백준(BOJ) 2018번 : 수들의 합 5 (0) | 2021.08.19 |
---|---|
(C++) - 백준(BOJ) 1689번 : 겹치는 선분 (0) | 2021.08.11 |
(C++) - 백준(BOJ) 1911 : 흙길 보수하기 (0) | 2021.05.05 |
(C++) - 백준(BOJ) 2170번 : 선 긋기 (0) | 2021.05.02 |
(C++) - 백준(BOJ) 1644번 : 소수의 연속합 (0) | 2017.03.30 |