https://www.acmicpc.net/problem/3273
수열을 입력받고 정렬한 다음에 제일 작은 쪽의 인덱스를 가리키는 수 하나와 제일 큰 쪽의 인덱스를 가리키는 수를 통해 문제를 해결하면 된다. 만약 목표로 하는 수보다 크다면 큰 쪽의 인덱스를 줄여주고 목표로 하는 수보다 작다면 작은 쪽의 인덱스를 증가시켜주고 만약 같다면 작은 쪽은 증가시켜주고 큰 쪽은 감소시키고 횟수 카운트를 증가시켜주면 된다.
정답코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n; // 수열 크기
vector<int> v(n);
for (int i = 0; i < n; i++) {
cin >> v[i];
}
sort(v.begin(), v.end()); // 수열 정렬
int target, cnt = 0;
cin >> target; // 목표 합
int p = 0, q = n - 1; // 투 포인터 초기화
while (p < q) {
int sum = v[p] + v[q];
if (sum == target) { // 목표 합과 같으면
cnt++;
p++;
q--;
}
else if (sum < target) {
p++; // 합이 작으면 작은 값을 증가
}
else {
q--; // 합이 크면 큰 값을 감소
}
}
cout << cnt << endl; // 쌍의 개수 출력
return 0;
}
'코딩테스트 > 백준' 카테고리의 다른 글
[백준][C++]2110번. 공유기 설치 (1) | 2024.12.02 |
---|---|
[백준][C++]9663번. N-Queen (1) | 2024.11.29 |
[백준][C++]11279번. 최대 힙 (1) | 2024.11.28 |
[백준][C++]7569번. 토마토 (1) | 2024.11.27 |
[백준][C++]7576번. 토마토 (1) | 2024.11.26 |