https://www.acmicpc.net/problem/2467
2467번: 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 -1,000,000,000 이상 1,000,000,000 이하이다. N개의 용액들의 특성값은 모두 서로 다르고, 산성 용액만으로나 알칼리성 용액만으로 입력이 주어지는 경우도 있을 수 있다.
www.acmicpc.net
<풀이>
1. 용액 배열 양쪽에서 다가오면서, 두 개의 합이 0에 가장 가까울 경우 저장해준다.
2. 두 개의 합이 0 보다 작을 경우, 조금 더 0보다 가까운 경우가 있는지 알아보기 위해 왼쪽에서 다가오는 index를 하나 늘려준다.
3. 두 개의 합이 0보다 클 경우, 조금 더 0보다 가까운 경우가 있는지 알아보기 위해 오른쪽에서 다가오는 index를 하나 줄여준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <iostream>
using namespace std;
const int MAX = 100000 + 1;
int N;
long long int arr[MAX];
long long int resA, resB;
int main() {
//입력
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
//양쪽에서 다가오는 index의 초기값
int left = 0;
int right = N - 1;
//결과값의 초기값
int resLiquid = abs(arr[left] + arr[right]);
resA = arr[left];
resB = arr[right];
//양쪽에서 다가오는 반복, 모든 경우 탐색 완료시 종료
while (left < right) {
int tmpLiquid = arr[left] + arr[right];
if (abs(tmpLiquid) < resLiquid) {
resLiquid = abs(tmpLiquid);
resA = arr[left];
resB = arr[right];
}
if (tmpLiquid < 0) {
left++;
}
else {
right--;
}
}
//출력
cout << resA << " " << resB << "\n";
}
|
투포인터에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 1992 - 쿼드트리 (0) | 2020.04.27 |
---|---|
[C++] 백준 2436 - 공약수 (0) | 2020.04.27 |
[C++] 백준 2559 - 수열 (0) | 2020.04.27 |
[C++] 백준 2468 - 안전 영역 (0) | 2020.04.27 |
[C++] 백준 2469 - 사다리 타기 (0) | 2020.04.27 |