[투포인터] 백준 3273 두 수의 합

2021. 6. 24. 14:17알고리즘 문제분석

https://www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

수행시간 : 15분 / 난이도 : 실버 3

 

저번 포스팅에서 설명한 투포인터 알고리즘을 그대로 이용하면 쉽게 풀 수 있는 문제였다.

max, min 값을 벡터의 인덱스로 접근하게 설정해주기!

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int ans = 0;
void sol(vector<int> a, int x, int n);

void input() {
	int n, x;
	vector<int> v;
	cin >> n;
	v.resize(n);
	for (int i = 0;i < n;++i) {
		cin >> v[i];
	}
	cin >> x;
	sort(v.begin(), v.end());
	sol(v, x, n);
}
void sol(vector<int> a, int x, int n) {
	int min_val = 0;
	int max_val = a.size() - 1;
	while (1) {
		int sum = 0;
		if (min_val >= max_val) {
			break;
		}
		sum = a[min_val] + a[max_val];
		if (sum == x) {
			ans++;
			min_val++;
			max_val--;
		}
		else if (sum > x) {
			max_val--;
		}
		else {
			min_val++;
		}
	}
}

int main() {
	input();
	cout << ans;
}