새벽을 밝히는 붉은 달

[C++/Python] 백준 10867번: sort와 sorted의 차이 본문

Online Judge

[C++/Python] 백준 10867번: sort와 sorted의 차이

자윰 2021. 6. 26. 20:50

📎 백준 10867번 풀러 가기

 

문제

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

입력

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

출력

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


정말정말 오랜만에 백준에 들어가보았다.

이번 방학에는 알고리즘 공부 좀 해볼 생각이다.

 

아무튼 그래서 처음 잡은 건 간단한 정렬문제! 인 줄 알았다.

 

처음에 딱 보자마자 set을 쓰면 금방 해결되겠네~ 했는데

sort를 하려고 했더니 에러가 뜨는 것이다.

그래서 set을 검색해보니 set은 순서가 없는 자료구조라고 되어 있었다.

 

아.. 그래서 그럼 list로 만들어준 다음 sort해줘야겠다 생각해서

list로 감싸준 후 .sort()를 해서 풀었다.

 

근데 다른 분들 푸신거 보니까 sorted()라는 함수도 쓰신 걸 볼 수 있었다.

그래서 이건 또 뭐지? 하고 찾아보니까

sort는 해당 리스트를 정렬해서 반환해주는 함수이고

sorted는 자체적으로 리스트를 생성해서 정렬한 리스트를 반환해주는 함수라고 되어있었다.

정말 파이썬은 유용한 함수가 많은 것 같다.

 

그리고 또 하나 주의해야할 점!

map을 써서 input을 받을 때 str인지 int인지 잘 살펴보자...^^

처음에 출력을 할 때 end로 인자를 줄 생각을 안하고, join으로 풀어야겠다고 생각을 해서

str로 인자를 설정했었는데 그랬더니 sort할 때 사전순으로 sort가 되어서 자꾸 틀렸다.

한... 다섯번 제출하고 뭐가 문제인지 깨달았었다.

꼭! 꼭!! map 인자 확인 잘하기. 


여기는 C++이야기.

 

사실 C++은 거의 C언어 기반으로 푸는거라

algorithm 라이브러리에 대해 잘 몰라서

열심히 구글링을 하면서 풀었다!

 

음 역시 정말 좋은 라이브러리긴 하더라.

중복된 값을 제외한 채 sort를 하는 방법은

 

sort(vector.begin(), vector.end());

를 해서 vector 내의 원소들을 정렬해준 후,

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

를 하면 중복된 값들이 사라진다.

 

이거에 대해서 설명을 하자면

unique에서 각 원소별로 하나의 값만 남겨두고 뒤로 싹 다 보낸다.

그리고 unique한 값이 끝나고 뒤로 보낸 중복된 값이 시작하는 점을 return하는데,

이거를 erase에 vector.end()와 함께 parameter로 넘겨주면

erase에 의해서 중복된 값들이 쓱 삭제되고 unique한 값만 남게 된다.

 

이렇게 해서 c++ 풀이도 끝!

 


아래는 내가 구현한 python 코드 👇

n = int(input())
num = sorted(set(map(int, input().split())))
for i in num:
    print(i, end=' ')

아래는 내가 구현한 C++ 코드 👇

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

int main() {
    int N;
    cin >> N;

    vector<int> num;
    int temp;
    for (int i = 0; i < N; i++) {
        cin >> temp;
        num.push_back(temp);
    }
    sort(num.begin(), num.end());
    num.erase(unique(num.begin(), num.end()), num.end());

    for (int i = 0; i < num.size(); i++) 
        cout << num[i] << ' ';
    
    return 0;
}

✍ 새로 안 사실들

1. set은 순서가 없는 자료구조이므로 정렬을 하고 싶다면 다른 자료구조 형태로 바꿔서 정렬해야 한다.

2. C++에서 unique는 각 원소별로 하나만 남겨두고, 중복된 값은 벡터의 뒤로 보낸 후, 중복된 값이 시작하는 index를 return한다.

Comments