-
백준 - 두 용액 (2470) [C++]문제 풀이/백준 2024. 11. 29. 00:26반응형
이 문제는 투 포인터를 이용해서 풀었다.
예전에 이분 탐색으로 풀다가 계속 틀려서 때려쳤던 기억이 있다.
이번에는 투 포인터가 먼저 보여서 투 포인터로 풀었는데, 한번에 풀 수 있었다.
N <= 100,000 이므로 O(N log N)까지의 알고리즘이 시간 초과가 나지 않는다.
양 끝단에서 시작하는 투 포인터를 생각했다. 각 양쪽에서 서로를 향해 이동하는데, 각자의 다음 위치로 미리 이동한 후 더 절댓값이 작아지는 쪽으로 이동시키는 로직으로 알고리즘을 구성했다.#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> input; int N; int absolute(int n) { return n >= 0 ? n : -n; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> N; for (int i = 0; i < N; i++) { int tmp; cin >> tmp; input.push_back(tmp); } sort(input.begin(), input.end()); int left = 0; int right = input.size() - 1; int answer = absolute(input[left] + input[right]); pair<int, int> result = { input[left], input[right] }; while (left < right) { int presentSum = absolute(input[left] + input[right]); if (presentSum < answer) { answer = presentSum; result = { input[left], input[right] }; } int nextLeft = input[left + 1]; int nextRight = input[right - 1]; if (absolute(nextLeft + input[right]) >= absolute(input[left] + nextRight)) { right--; } else { left++; } } cout << result.first << " " << result.second << '\n'; return 0; }
반응형'문제 풀이 > 백준' 카테고리의 다른 글
백준 - 사탕상자 (2243) [C++] (0) 2024.12.02 백준 - 파일 합치기 (11066) [C++] (0) 2024.12.01 백준 - 수열과 쿼리 17 (14438) [C++] (0) 2024.11.28 백준 - 히스토그램에서 가장 큰 직사각형 (6549) [C++] (0) 2024.11.28 백준 - 가운데를 말해요 (1655) [C++] (0) 2024.11.04