새벽을 밝히는 붉은 달
[C++/Python] 백준 10867번: sort와 sorted의 차이 본문
문제
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한다.
'Online Judge' 카테고리의 다른 글
[Python] 백준 2581번: 소수 개념 다시 짚기! (0) | 2021.06.29 |
---|---|
[Python] 백준 2108번: Counter에 대하여 공부 (1) | 2021.06.27 |
[Python] 프로그래머스 모의고사: enumerate()함수에 대해 공부 (0) | 2021.01.11 |
[C++] 백준 10989번: counting sort 사용해보기! (0) | 2021.01.11 |
[C++] 백준 2798번: 완전 탐색 (0) | 2021.01.11 |