문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
입력
5
5
4
3
2
1
출력
1
2
3
4
5
풀이
문제는 수 정렬하기로 정렬 단계에서 하는 문제이긴한데 결국 제목에서 전부 주어진 상태에서 문제를 진행한다.
여기 문제에 보면 알 수 있듯이 O(nlogn)d의 정렬 알고리즘으로 풀면 된다. 기본적인 작동원리는 전부 알고 있지만 간단하게 힙 정렬을 사용해보기로 했다.
힙 정렬은 collection 중에서 priority_queue를 사용하면 된다. 우선순위 큐로 큐와 같이 먼저 들어온 값이 나가는건 맞지만 우선순위에 따라서 그 순서가 조정된다.
아무튼 이걸 간단하게 활용하면 C++ 에서는 헤더 #include <queue>를 쓰면 queue안에 priority_queue가 있는 것 같다. 그냥 가볍게 써주면 되는 문제여서 아주 쉬웠다.
코드
#include <iostream>
#include <string>
#include <queue>
#include <cstdio>
using namespace std;
int main(void){
int n;
scanf("%d", &n);
priority_queue< int,vector<int>,greater<int> > pq;
for(int i = 0 ; i < n ; i++){
int temp;
scanf("%d", &temp);
pq.push(temp);
}
while(true){
printf("%d\n",pq.top());
pq.pop();
if(pq.size() == 0) break;
}
return 0;
}
코드에 대해서 간략하게 적어보자면 priority_queue는 인자로 자료형 뿐만 아니라 2가지를 더 가질 수 있다.(인자가 하나여도 괜찮다.)
구조는 priority_queue<(자료형), (자료구조), (내림차순 or 오름차순)> 으로 들어간다.
자료형 : 우리가 알고 있는 int, long, float, char 등이 해당된다.
자료구조 : 힙을 구현할 때 어떤 형식으로 들어가는가를 정해주는 것이다.
내림차순 or 오름차순 : greater<int>를 사용하면 오름차순 less<int>를 사용하면 내림차순이다.
이렇게 옵션을 줘서 조금 더 디테일하게 설정을 할 수가 있다. 기본적으로 힙의 경우 삽입하는 것만으로 자동 정렬이 되기 때문에 넣고 다시 빼는 작업을 진행하면 된다.
'공부 > C++' 카테고리의 다른 글
[C/C++] 통계학 (백준 2108) (0) | 2020.08.18 |
---|---|
[C/C++] 수 정렬하기 3 (백준 10989) (0) | 2020.08.18 |
[C/C++] 영화감독 숌 (백준 1436) (0) | 2020.08.14 |
[C/C++] 체스판 다시 칠하기 (백준 1018) (0) | 2020.08.14 |
[C/C++] 덩치 (백준 7568) (0) | 2020.08.14 |