반응형
알고리즘 종류
- 투 포인터
사고 과정
- 두 개의 포인터를 배열의 양끝에 놓고 비교하면서 포인터를 움직이면 된다.
1. left와 right에 해당하는 값을 더해서 sum을 구한다.
2. sum의 절대값이 이전의 값보다 작으면, left와 right가 가리키는 값을 저장한다.
3. left와 right가 교차할 때까지 반복한다.
구현(C++)
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
|
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
vector<long long> v;
int main(void){
cin >> n;
v.resize(n, 0);
for(int i=0; i<n; i++) cin >> v[i];
sort(v.begin(), v.end());
int left=0, right=n-1;
long long sum, answer=9987654321;
long long liquid_1, liquid_2;
while(left < right){
sum = v[left] + v[right];
if(abs(sum) < answer){
answer = abs(sum);
liquid_1 = v[left];
liquid_2 = v[right];
}
if(sum <= 0) left++;
else if(sum > 0) right--;
}
cout << liquid_1 << " " << liquid_2 << "\n";
}
|
cs |
시행착오
- 이분탐색으로 풀어볼려고 했다. 왜냐하면, 투 포인터로 풀 수 없을 것 같았기 때문이다. 지금까지 풀어온 투 포인터의 문제는 왼쪽에서 left와 right가 출발하는 유형이었다. 그런데 여기서는 left 포이터를 왼쪽에두고, right 포인터를 오른쪽에 두어서 수행하면 된다. 투 포인터의 유형을 하나 더 배우게 되었다.
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 2175 로봇 시뮬레이션 (0) | 2021.02.23 |
---|---|
[백준]][C++] 1022 소용돌이 예쁘게 출력하기 (0) | 2021.02.23 |
[백준][C++] 1613 역사 (0) | 2021.02.19 |
[백준][C++] 20327 배열 돌리기 6 (0) | 2021.02.18 |
[백준][C++] 1202 보석 도둑 (0) | 2021.02.16 |