백준 문제풀이/실버5

백준 10867번 - 중복 빼고 정렬하기

void_melody 2022. 6. 21. 08:48

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

 

10867번: 중복 빼고 정렬하기

첫째 줄에 수의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

풀이를 무려 3가지나 떠올렸다!!!

 

1번 풀이) 

중복을 허용하지 않으면서, 오름차순으로 자동정렬하는 stl은 set이 있다.

그래서 set을 활용해봤다.

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	set<int> s;
	int n;
	cin >> n;
	int num;
	
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		s.insert(num);
	}
	for (set<int>::iterator i = s.begin(); i != s.end(); i++)
	{
		cout << *i << ' ';
	}

	return 0;
}

2번 풀이)

정렬한 다음에 중복이 나오면 그냥 건너뛰는 방식

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, num;
	cin >> n;
	vector<int> v;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		v.push_back(num);
	}
	sort(v.begin(), v.end());

	int temp = v[0];
	cout << temp << ' ';
	for (int i = 1; i < n; i++)
	{
		if (v[i] == temp)
			continue;
		else
		{
			temp = v[i];
			cout << temp << ' ';
		}
	}
}

3번 풀이)

unique와 erase 함수를 사용하기. 이건 자주 사용하는 것 같다.

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

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int n, num;
	cin >> n;
	vector<int> v;
	for (int i = 0; i < n; i++)
	{
		cin >> num;
		v.push_back(num);
	}
	sort(v.begin(), v.end());

	v.erase(unique(v.begin(), v.end()), v.end());

	for (auto& i : v)
	{
		cout << i << ' ';
	}
}