백준/실랜디, 골랜디

[백준] 좋다(1253)

2zreal 2025. 1. 8. 20:39

 

이 문제는 투포인터 문제이다.

문제를 보면 눈치챘다시피 정렬을 하고 문제를 풀어야 한다.

이 문제에서 주의할 점은 Ai는 음수도 나올 수 있다는 점이다. 이 점을 숙지하고 문제를 풀어야 한다.

 

문제풀이방법

1. 배열을 정렬한다.

2. L와 R을 두고 양쪽에서 서서히 좁히면서 값을 찾는다.(L은 배열의 가장 앞, R은 배열의 가장 끝부분)

3. 만약 arr[L]+arr[R]의 값이 지금 찾고자 하는 값보다 크다면 R을--하고 작다면 L을++한다.(이 문제를 풀기 위해 꼭 떠올려야 함)

4. 만약 L과 R이 지금 찾고자 하는 값의 index와 같다면 L은 ++를 해주고 R은 --를 해준다.(이 과정을 한 뒤에는 L<R의 범위를 초과할 수도 있기 때문에 꼭 continue를 해줘서 다시 범위를 확인해줘야 한다.)

5. 만약 arr[L]+arr[R]의 값이 찾고자 하는 값과 같다면 count++를 해준다.

 

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

using namespace std;
vector<int> v;

int main(void)
{
	int N = 0;
	int count = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		int num = 0;
		cin >> num;
		v.push_back(num);
	}

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

	for (int i = 0; i < v.size(); i++)
	{
		int L = 0;
		int R = v.size() - 1;
		int num = v[i];
		
		while (L<R)
		{
			if (R == i)
			{
				R--;
				continue;
			}
			if (L == i)
			{
				L++;
				continue;
			}
			int sum = v[L] + v[R];
			if (sum > num)
			{
				R--;
			}
			else if (sum < num)
			{
				L++;
			}
			else
			{
				count++;
				break;
			}
		}
	}

	cout << count;

	return 0;
}

 

 

 

 

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

using namespace std;
vector<int> v;

int main(void)
{
	int N = 0;
	int count = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		int num = 0;
		cin >> num;
		v.push_back(num);
	}

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

	for (int i = 0; i < v.size(); i++)
	{
		int L = 0;
		int R = v.size() - 1;
		int num = v[i];
		
		while (L<R)
		{

			int sum = v[L] + v[R];
			if (sum > num)
			{
				R--;
			}
			else if (sum < num)
			{
				L++;
			}
			else
			{
				if (L != i && R != i)
				{
					count++;
					break;
				}
				else if(L==i)
				{
					L++;
				}
				else if(R==i)
				{
					R--;
				}
			}
		}
	}

	cout << count;

	return 0;
}