어흥

[백준 3273] 두 수의 합 (C++) 본문

알고리즘/백준

[백준 3273] 두 수의 합 (C++)

라이언납시오 2020. 10. 19. 23:09
728x90
반응형

문제 링크: www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

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

www.acmicpc.net

1. 주의할 점

- 딱히 없다... 배열을 이용하여 A + B = X를 만족하는 B(=X-A)를 찾아도 된다

 

2. 구현

- 정렬을 통해 수를 오름차순 정렬시킨다

- 양끝에서 시작하는 투포인터로 접근한다

- While문이 끝나는 경우로는 l이 r과 같거나 크면! (같다고만 하면 런타임 에러 발생할 수도 있다. 아래에 예시가 존재!)

더보기

2

1 2

3

답: 1

- 두 수의 합이 Target과 같다면 왼쪽++, 오른쪽--를 수행

- 두 수의 합이 Target보다 작다면 수가 커져야 하므로 왼쪽++

- 두 수의 합이 Target보다 크가면 수가 작아져야하므로 오른쪽--

 

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

int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int num, a, target;
	cin >> num;
	vector<int> v;
	for (int i = 0; i < num; i++) {
		cin >> a;
		v.push_back(a);
	}
	cin >> target;
	sort(v.begin(), v.end());
	int l = 0, r = num-1, cnt = 0;

	while (1) {
		if (l >= r) 
			break;
		int sum = v[l] + v[r];
		if (sum == target) {
			cnt++;
			l++;
			r--;
		}
		else if (sum < target)
			l++;
		else
			r--;
	}
	cout << cnt;
	return 0;
}
728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1092] 배 (C++)  (4) 2020.10.26
[백준 10216] Count Circle Groups (C++)  (0) 2020.10.20
[백준 8911] 거북이 (C++)  (0) 2020.10.12
[백준 1965] 상자넣기 (C++)  (0) 2020.10.07
[백준 1800] 인터넷 설치 (C++)  (0) 2020.10.04
Comments