BOJ/정렬

[C/C++] 백준 - 10867번 : 중복 빼고 정렬하기

JWonK 2021. 8. 3. 17:57
728x90
반응형

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

 

10867번: 중복 빼고 정렬하기

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

www.acmicpc.net

문제

N개의 정수가 주어진다. 이때, N개의 정수를 오름차순으로 정렬하는 프로그램을 작성하시오. 같은 정수는 한 번만 출력한다.

입력

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

출력

첫째 줄에 수를 오름차순으로 정렬한 결과를 출력한다. 이때, 같은 수는 한 번만 출력한다.

 

입력하는 수들에 대해서 정렬을 하는 문제인데 조건이 붙는다. ( * 같은 정수는 한 번만 출력한다.)

처음에는 절댓값이 1000보다 작거나 같은 정수라는 표현을 못보고 visited배열을 선언해서 해결하려했다.

하지만 이렇게 배열을 통해 이런 문제를 해결하려하면 음수가 나왔을 때 런타임 에러가 뜬다(Out of Bounds)

 

그래서 C++이 제공하는 STL중 map을 사용해서 해결했다.

map을 사용하게 되면 선언하는 자료형의 범위에 대해서 모두 확인이 가능하기 때문에 이런 음수를 확인하거나 찾는 문제들에 한해서는 매우 유용하게 쓰일 수 있다.

 

아래는 코드이니 코드를 보고 꼭 이해하시길 바랍니당. 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#define INF 9876543210
using namespace std;

// BOJ :: https://www.acmicpc.net/problem/16986

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

	int N; cin >> N;
	map<int, int> m;

	queue<int> q;
	for (int i = 0; i < N; i++) {
		int x; cin >> x;
		if (m.find(x) == m.end()) {
			m.insert({ x, x });
			q.push(x);
		}
	}

	vector<int> Answer;
	while (!q.empty()) {
		int Data = q.front();
		q.pop();

		Answer.push_back(Data);
	}
	sort(Answer.begin(), Answer.end());
	
	for (int i = 0; i < Answer.size(); i++) cout << Answer[i] << " ";

	return 0;
}
728x90
반응형