🙇‍♀️교집합

두 집합 A, B가 주어지면 두 집합의 교집합을 출력하는 프로그램을 작성하세요.

▣ 입력설명
첫 번째 줄에 집합 A의 크기 N(1<=N<=30,000)이 주어집니다.

두 번째 줄에 N개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.

세 번째 줄에 집합 B의 크기 M(1<=M<=30,000)이 주어집니다.

네 번째 줄에 M개의 원소가 주어집니다. 원소가 중복되어 주어지지 않습니다.

각 집합의 원소는 int형 변수의 크기를 넘지 않습니다.

▣ 출력설명
두 집합의 교집합을 오름차순 정렬하여 출력합니다.

▣ 입력예제 1 
5
2 7 10 5 3
5
3 10 5 17 12

▣ 출력예제 1
3 5 10

🚀풀이

두 벡터에 값을 받고 정렬을 한다.
그 뒤에 결과를 받을 벡터는 각 벡터의 현재위치를 확인하면서 값을 비교하고 같으면 결과 벡터에 집어넣는 방식이다.
한 쪽 벡터의 값이 작으면 작은 쪽 벡터의 위치값을 증가시키면서 끝까지 순회한다.

처음에 이중for문으로 비교를 했는데 타임리미트가 나와서 수정했다.

void solve()
{
	int pos1 = 0, pos2 = 0, pos3 = 0;
	int N, M;
	cin >> N;
	vector<int> seq1(N);
	for (int i = 0; i < N; ++i)
		cin >> seq1[i];
	sort(seq1.begin(), seq1.end());

	cin >> M;
	vector<int> seq2(M);
	for (int i = 0; i < M; ++i)
		cin >> seq2[i];
	sort(seq2.begin(), seq2.end());

	vector<int> res;
	while (pos1 < N && pos2 < M)
	{
		if (seq1[pos1] < seq2[pos2])
		{
			pos1++;
		}
		else if (seq1[pos1] > seq2[pos2])
		{
			pos2++;
		}
		else
		{
			res.push_back(seq1[pos1]);
			pos1++;
			pos2++;
		}
	}

	for (int i = 0; i < res.size(); ++i)
		cout << res[i] << " ";
}

🚀전체 코드

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

void solve()
{
	int pos1 = 0, pos2 = 0, pos3 = 0;
	int N, M;
	cin >> N;
	vector<int> seq1(N);
	for (int i = 0; i < N; ++i)
		cin >> seq1[i];
	sort(seq1.begin(), seq1.end());

	cin >> M;
	vector<int> seq2(M);
	for (int i = 0; i < M; ++i)
		cin >> seq2[i];
	sort(seq2.begin(), seq2.end());

	vector<int> res;
	while (pos1 < N && pos2 < M)
	{
		if (seq1[pos1] < seq2[pos2])
		{
			pos1++;
		}
		else if (seq1[pos1] > seq2[pos2])
		{
			pos2++;
		}
		else
		{
			res.push_back(seq1[pos1]);
			pos1++;
			pos2++;
		}
	}

	for (int i = 0; i < res.size(); ++i)
		cout << res[i] << " ";
}

int main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	//freopen("input.txt", "rt", stdin);

	solve();

	return 0;
}