[백준1036]좋다

뚱환·2023년 5월 9일
0

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

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

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

풀이

투포인터로 풀어야한다.

먼저 입력 받은 수를 오름차순으로 정렬을 실시한다.
for문을 n까지 k로 탐색한다
포인터는 left 0번째 idx
right는 n-1번째 idx
for 안에서 while (left < right)까지 포인터를 가지고 탐색한다.
left 인덱스와 right 인덱스의 원소의 합이 현재 k의 원소의 값과 같음
좋은수를 count 한다.

예외처리를 k와 left & k와 right시 해주는 이유는
0과 자기 자신으로 좋은수가 나올 수 있기 때문이다.

코드

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

int main()
{

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n;
	cin >> n;
	int cnt = 0;
	vector<int> arr(n, 0);
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}

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

	for (int k = 0; k < n; k++)
	{
		long find = arr[k];
		int right = n - 1;
		int left = 0;

		while (left < right)
		{
			if (arr[left] + arr[right] == find)
			{
				if (left != k && right != k) {
					cnt++;
					break;
				}
				else if(left==k)
				{

						left++;

				 }
				else if (right== k)
				{
					right--;
				}
			}
			else if (arr[left] + arr[right]< find)
			{
				left++;
			}
			else
			{
				right--;
			}

		}
	}
	cout << cnt;

}
profile
https://github.com/lixxce5017/Algoritm_Weekly_Baekjoon

0개의 댓글