코딩테스트

[백준] 좋다 c++

코딩너구리 2024. 9. 20. 14:51

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

입력

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.


 

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

//좋다 1523
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n = 0;
	int count = 0;

	cin >> n;

	vector<int> a(n, 0);

	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}

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

	for (int k = 0; k < n; k++)
	{
		int i = 0;
		int j = n - 1;

		long target = a[k];

		while (i < j)
		{
			if (i != k && j != k)
			{
				long sum = a[i] + a[j];

				if (sum == target)
				{
					count++;
					break;
				}
				else if (sum < target)
				{
					i++;
				}
				else
				{
					j--;
				}
			}
			else
			{
				if (j == k)
				{
					j--;
				}
				else
				{
					i++;
				}
			}
		}
	}

	cout << count;
}

 

두 개의 포인터를 이용해 값을 비교해야 할 때는 정렬을 사용해준다. 그리고 while문을 통해 target과 맞는 수 가 있는지 반복적으로 돌아주면서 더이상 비교할 수 없을때 빠져나오게한다 while(i<j)

 

if (i != k && j != k)
{
	long sum = a[i] + a[j];

	if (sum == target)
	{
		count++;
		break;
	}
	else if (sum < target)
	{
		i++;
	}
	else
	{
		j--;
	}
}
else
{
	if (j == k)
	{
		j--;
	}
	else
	{
		i++;
	}
}

우선 i와 j가 k에 포함되어 있다면 자동으로 넘어가도록 설정을 해준다. 포함되지 않는다면 두 수를 비교해 처리를 한다.

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