Algorithm/Algorithm
[Algorithm]Baekjoon 9024번 :: 두 수의 합
MaxLevel
2025. 11. 4. 19:05
https://www.acmicpc.net/problem/9024
|
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
#include <math.h>
#include <queue>
#include <functional>
#include <sstream>
#include <memory.h>
#include <deque>
#include <set>
#include <unordered_set>
#include <thread>
#include <atomic>
using namespace std;
int t, n, k;
int arr[1000001] = { 0 };
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> t;
while (t--)
{
cin >> n >> k;
for (int i = 0; i < n; ++i)
{
cin >> arr[i];
}
sort(arr, arr + n);
int left = 0;
int right = n - 1;
int minGap = 0x3f3f3f3f;
int minGapCount = 0;
while (left < right)
{
int num = arr[left] + arr[right];
int gap = abs(k - num);
if (gap == minGap) // 현재까지의 최소갭과 동일하면 카운팅
{
++minGapCount;
}
else if (gap < minGap) // 더 작으면 업데이트.
{
minGap = gap;
minGapCount = 1;
}
if (num <= k)
{
++left;
}
else
{
--right;
}
}
printf("%d\n", minGapCount);
}
}
|
cs |
약간 투포인터문제의 정석 느낌이 나는 문제다.
타겟값k와 가장 가까운 두 수의 합을 구한다음 그 합의 개수까지 구해야 한다.
배열을 정렬 후, 양끝에 두개의 포인터를 둔다음 탐색을 시작할 건데, 값이 오름차순으로 정렬되어 있기 때문에 두 포인터가 가리키는 숫자의 합이 작을경우 값을 늘려야하니까 왼쪽포인터를 한칸 오른쪽으로 옮긴다.
두 숫자의 합이 크면 값을 줄여야하니까 오른쪽포인터를 한칸 왼쪽으로 옮긴다.
매번 옮길때마다 k와의 gap을 업데이트 해주면 되는데 최종출력은 개수를 출력하는 거라서 매 탐색 시 현재까지의 최소gap값과 일치하면 카운팅 해주면 된다. gap값이 더 작은값을 발견하면 다시 초기화해주면 되고.