https://www.acmicpc.net/problem/1253
[필자 사고]
이 문제는 주어진 수열에서 특정 수가 수열 내 다른 두 수의 합으로 표현될 수 있는지를 찾는 것이다. 이를 해결하기 위해 다음 절차를 따른다:
- 투 포인터 알고리즘 적용: 각 수에 대해, 그 수가 다른 두 수의 합으로 표현될 수 있는지 확인한다. 이를 위해 수열의 처음과 끝에 위치한 두 포인터(startIdx, endIdx)를 사용하여, 두 수의 합이 현재 수와 일치하는지 비교한다
- 조건 검토: 만약 현재 수가 두 포인터가 가리키는 수의 합과 같다면, 해당 수는 두 수의 합으로 표현될 수 있다. 이때, 현재 수가 두 포인터 중 하나와 겹치지 않을 때만 결과값을 증가시킨다.
- 결과 출력: 모든 수에 대해 이 과정을 반복한 후, 조건을 만족하는 수의 개수를 출력한다.
핵심 요약: 이 문제는 주어진 수열에서 특정 수가 다른 두 수의 합으로 표현될 수 있는지를 찾는 것이다. 이를 해결하기 위해 수열을 정렬한 후, 투 포인터 알고리즘을 사용해 효율적으로 문제를 풀며, 최종적으로 조건을 만족하는 수의 개수를 출력한다.
[소스 코드]
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<long> arr;
int N;
void Input() {
cin >> N;
arr.resize(N);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
}
long GameStart() {
long resultCount = 0;
for (int k = 0; k < N; k++) {
long nowNum = arr[k];
int startIdx = 0;
int endIdx = N - 1;
while (startIdx < endIdx) {
if (nowNum == arr[startIdx] + arr[endIdx]) {
if (k != startIdx && k != endIdx) {
resultCount++;
break;
}
else if (k == startIdx) {
startIdx++;
}
else if (k == endIdx) {
endIdx--;
}
}
else if (nowNum > arr[startIdx] + arr[endIdx]) {
startIdx++;
}
else {
endIdx--;
}
}
}
return resultCount;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
cout<<GameStart();
}
'백준 > 투포인터' 카테고리의 다른 글
백준 2467 c++ "용액" -PlusUltraCode- (0) | 2025.01.02 |
---|---|
백준 1806 c++ "부분합" -PlusUltraCode- (0) | 2024.12.25 |
백준 12891 c++ "DNA 비밀번호" -PlusUltraCode- (0) | 2024.08.14 |
백준 1940 c++ "주몽" -PlusUltraCode- (0) | 2024.08.13 |