본문 바로가기
알고리즘 문제풀이

[백준 11931] 알고리즘 67일차 : 수 정렬하기4

by SiO2whocode 2021. 1. 18.
728x90

www.acmicpc.net/problem/11931

 

11931번: 수 정렬하기 4

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

www.acmicpc.net

정렬 C++

아 무엇. 입력에 중복 없는거 지금봄.

일단 내림차순 정렬 문제고

변명시작. 오늘 정말 상당한 투두를 소화해냈거든요. 그래서 사실 문제풀이는 3/4쯤 포기 했었어요.

하지만 어쩌다보니 시간이 돼서 풀었어요. 하지만 그게 마음대로 되나요 문제 한 4개정도 간보다가

문제 랭크 실버 이상 풀어야해서 실버 5정도만 골라보다가 진짜 안되겠다 싶어서 정렬을 풀기로 했습니다..

양아치같은 문제 선정이었지만 그래도 나름 얻어가는건 있었어요. 중복없이 정렬하기 참 매번 보긴하는데

이번에 라이브러리 좀 제대로 써서 풀자 해서 100% 라이브러리로만 풀었음.

이상 변명 끝.

 

vector의 내림차순 정렬 : sort(vector.begin(), vertor.end(), greater<>()) : 기존 sort쓰는 방식에 마지막 매개변수로 원래 compare 메소드를 만들어서 넣을 수도 있지만 귀찮죠. 그럴땐 greater<>()를 쓰면 됩니다. 오름차순은 그냥 안쓰면 됨

이렇게만하면 중복 되는 수는 그대로 중복 됩니다. 예를 들면 1 1 2 2 3 이렇게

 

중복을 없애려면 unique 메소드를 사용합니다.

unique함수는 unique(vector.begin(), vector.end())이런 식으로 사용하는데

이렇게 하면 중복된 값이 맨뒤로 이동합니다. 1 2 3 1 2 이런식으로 뒤에 1,2를 쓰레기 값이라고 하는데

unique함수는 이 쓰레기 값의 첫번째 위치 위의 예시에서는 1의 위치를 반환합니다.

그래서 이후에 erase함수를 사용하여 쓰레기값을 삭제합니다.

erase함수는 vector.erase(삭제 시작 점, 삭제 끝 점) 이렇게 사용하고

이렇게 되면 vector의 size가 변경됩니다.

고로 vector.erase( unique(vector.begin(), vector.end()) , vector.end() ) 이렇게 쓰면

unique함수가 리턴한 쓰레기 값의 첫번째 위치 ~ 끝 까지의 값이 삭제되는 것처럼 동작한다.

(실제로는 삭제되진 않고 벡터의 사이즈가 바뀜)

 

쉬운걸 풀어서 말이 많았습니다..하하..

소스코드

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> arr = vector<int>();
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    int num;
    for(int i = 0 ; i < n ; i++){
        cin >> num;
        arr.push_back(num);
    }
    sort(arr.begin(),arr.end(),greater<>());
    arr.erase(unique(arr.begin(),arr.end()),arr.end());
    for(int i = 0 ; i < arr.size() ; i++)
        cout << arr[i] << "\n";
    return 0;
}
728x90