본문 바로가기
알고리즘/C++

[백준] 3273번 두수의 합

by 엑츄얼리 2021. 3. 6.

www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

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

www.acmicpc.net

처음에 짰던 코드는

입력을 배열에 저장 후 2중 for문을 통해 O(N^2)으로 원소를 2개씩 조합하여 확인하는 것이었다.

 

검색을 통해 O(N)으로 처리한 방식이 인상적이였어서 개인적으로 남겨놓고 싶다.

 

1. 입력을 배열에 저장후 sort를 통해 배열을 오름차순으로 정리한다.

2. 2개의 커서를 배열의 시작값과 끝값에 존재시키고 반복문을 실행한다.

3. 2개의 커서가 가르키는 갚들의 합을 tmp에 저장시킨다.

4. tmp의 값에 따라 result(결과값)을 증가시키거나 시작커서를 증가시키거나 끝커서를 종료시키는 과정을 수행한다.

5. 시작 커서의 값이 끝 커서보다 같거나 커지면 반복문을 종료시킨다.

더보기
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int n, x, cnt;

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n, x;
	vector<int> arr;
	int result = 0;

	cin >> n;

	int buf;
	for (int i = 0; i < n; i++) {
		cin >> buf;
		arr.push_back(buf);
	}

	cin >> x;

	int start = 0;
	int end = n - 1;

	sort(arr.begin(), arr.end());

	while (end > start) {
		buf = arr[start] + arr[end];
		if (buf == x) {
			result++;
			start++;
			end--;
		}

		else if (buf > x)
			end--;

		else start++;
	}

	cout << result;
}

'알고리즘 > C++' 카테고리의 다른 글

[백준] 9466번 텀 프로젝트  (0) 2021.03.13
[백준] 4179번 불!  (0) 2021.03.13
[백준] 1600 말이 되고픈 원숭이  (0) 2021.03.10
[백준] 6198번 옥상 정원 꾸미기  (0) 2021.03.08
[백준] 1406번 에디터  (0) 2021.03.06

댓글