문제링크 : https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int arr[100001];
int l, r;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
for(int i=0; i<N; i++)
{
cin >> arr[i];
}
int s = 0, e = N-1;
int result = 2000000002;
while(s<e)
{
if(result > abs(arr[s]+arr[e])) //0에 가까운 값 저장
{
result = abs(arr[s]+arr[e]);
l = arr[s];
r = arr[e];
}
if(arr[s]+arr[e] < 0) s++; //음수의 경우 값이 더 큰 쪽으로 이동
else e--; //양수의 경우 값이 더 작은 쪽으로 이동
}
cout << l << " " << r;
return 0;
}
투포인터를 활용한 문제이다.
시작점을 맨 왼쪽과 맨 오른쪽으로 잡고 시작한다.
먼저 찾고자 하는 값이 0에 가장 가까운 값을 찾는 것이기 때문에 arr[s] + arr[e]의 값에 절대값을 씌워준다.
절대값을 씌워준 상태에서 제일 작은 값을 찾으면 0에 가장 가까운 값을 찾게되는 것이다.
이때 값을 갱신해주는 동시에 위치도 같이 저장해준다.
값을 저장해줄때는 마찬가지로 절대값을 씌워주는 것을 잊으면 안된다.
그리고 입력으로 주어진 수가 오름차순으로 정해져 있는 것을 볼 수 있다.
따라서 현재 값이 음수인 경우에는 값이 더 큰 쪽으로 이동하여 차이를 줄이고(s++),
현재 값이 양수인 경우에는 값이 더 작은 쪽으로 이동하여 차이를 줄여준다.(e--)
'백준 > 골드' 카테고리의 다른 글
[백준 1759번] 암호 만들기 (C++) (0) | 2023.08.30 |
---|---|
[백준 10942번] 팰린드롬? (C++) (0) | 2023.08.27 |
[백준 2166번] 다각형의 면적 (C++) (0) | 2023.08.25 |
[백준 1806번] 부분합 (C++) (0) | 2023.08.24 |
[백준 27172번] 수 나누기 게임 (C++) (0) | 2023.08.23 |