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

두 수의 합

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

시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초128 MB39068138991042834.896%

문제

n개의 서로 다른 양의 정수 a1, a2, …, an으로 이루어진 수열이 있다.

ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다.

자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

(ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다.

다음 줄에는 수열에 포함되는 수가 주어진다.

셋째 줄에는 x가 주어진다.

(1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

예제 입력 1

5
1 1 1 6 0
2 7 8 3 1

예제 출력 1

18

출처

Olympiad > Balkan Olympiad in Informatics > Junior Balkan Olympiad in Informatics > JBOI 2008 6번

알고리즘 분류


통과된 코드

투 포인터와 재귀를 이용하여 접근

N이 1인 경우를 조심하자

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int _N, _Res = 0, _Sum;
vector<int> _NumberV;

bool Greater(int a, int b)
{
	return a > b;
}

void TwoPointer(int _S, int _E)
{
	if (_S >= _E || _E >= _N || _S >= _N)
		return;
	if (_NumberV[_S] + _NumberV[_E] >= _Sum) {
		if (_NumberV[_S] + _NumberV[_E] == _Sum)
			_Res++;
		TwoPointer(_S + 1, _E);
	}
	else TwoPointer(_S, _E - 1);
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin >> _N;
	int _Temp;
	for (int i = 0; i < _N; i++) {
		cin >> _Temp;
		_NumberV.push_back(_Temp);
	}

	cin >> _Sum;
	sort(_NumberV.begin(), _NumberV.end(), Greater);
	if (_N > 1)
		TwoPointer(0, _N - 1);
	cout << _Res;
	return 0;
}

위는 백터를 이용(동적으로 생성) / 아래는 배열로 [100000]의 공간을 미리 선언

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤