인프런 알고리즘테스트 문제

40번 투포인트 알고리즘(Microsoft interview 문제)

풀스택 개발자 2020. 9. 18. 01:08
#include<iostream>
#include<vector>
using namespace std;

int main(void)
{
	
	int N = 0;
	int M = 0;
	int cnt = 0;
	cin >> N;
	int arr[60000];
	vector<int> result(N);
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}
	cin >> M;
	for (int i = N; i < N + M; i++)
	{
		cin >> arr[i];
	}
	for (int i = 0; i < N; i++)
	{
		for (int j = N; j < N + M; j++)
		{
			if (arr[i] == arr[j])
			{
				result[cnt] = arr[i];
				cnt++;
				break;
			}
			
		}
	}
	int min = 0;
	int mtemp = 0;
	int temp = 0;
	for (int i = 0; i < N; i++)
	{
		min = result[i];
		mtemp = i;
		for (int j = i; j < N; j++)
		{
			if (min > result[j])
			{
				min = result[j];
				mtemp = j;
			}
		}
		temp = result[i];
		result[i] = result[mtemp];
		result[mtemp] = temp;
	}

	for (int i = 0; i < N; i++)
	{
		if (result[i] != 0)
		{
			cout << result[i] << " ";
		}
		
	}
}

위 방법은 투포인트 알고리즘X 따라서 타임리밋 발생..

 

투포인트 알고리즘

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

int main(void)
{
	int N = 0;
	int M = 0;
	cin >> N;
	vector<int> arr(N);
	for (int i = 0; i < N; i++)
	{
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end());
	
	cin >> M;
	vector<int> brr(M);
	for (int i = 0; i < M; i++)
	{
		cin >> brr[i];
	}
	sort(brr.begin(), brr.end());

	vector<int> result(N + M);

	int p1=0, p2=0, cm=0;

	while (p1 < N && p2 < M)
	{
		if (arr[p1] == brr[p2])
		{
			result[cm] = arr[p1];
			p1++;
			p2++;
			cm++;
		}
		else if (arr[p1] < brr[p2])
		{
			p1++;
		}
		else if (arr[p1] > brr[p2])
		{
			p2++;
		}
	}

	for (int i = 0; i < N + M; i++)
	{
		if (result[i] != 0)
		{
			cout << result[i] << " ";
		}
	}
}