문제
알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
- 길이가 짧은 것부터
- 길이가 같으면 사전 순으로
단, 중복된 단어는 하나만 남기고 제거해야 한다.
입력
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
출력
조건에 따라 정렬하여 단어들을 출력한다.
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
bool cmp(const string &a, const string &b){
if(a.length() == b.length()){
return a < b; //사전
}
else {
return a.length() < b.length(); //길이
}
}
int main()
{
int n;
cin >> n;
vector<string> s(n);
for(int i = 0; i < n; i++){
cin >> s[i];
}
sort(s.begin(),s.end(), cmp);
s.erase(unique(s.begin(), s.end()), s.end());
for(int i =0; i < s.size(); i++){
cout << s[i] << "\n";
}
return 0;
}
문제 풀이
sort 알고리즘을 이용하여 문자열 비교 정렬 후 중복된 숫자를 제거한다.
- 정렬하려는 문자의 길이가 같지 않는다면 길이가 작은 순서대로 정렬하고 같다면 사전 순으로 정렬한다
- unique함수를 이용하여 중복된 숫자를 배열의 마지막으로 이동시킨 뒤에 erase함수를 이용하여 배열의 뒤로 이동한 중복된 문자들을 제거한다
- 변경된 배열의 사이즈만큼 출력한다
'Koala - 13기 > 기초 알고리즘 스터디' 카테고리의 다른 글
[백준/C++] 16435: 스네이크버드 (0) | 2024.02.12 |
---|---|
[백준/C++] 12789: 도키도키 간식드리미 (0) | 2024.02.12 |
[백준/python] 2789번: 유학 금지 (0) | 2024.02.11 |
[백준/python] 3029번 경고 (0) | 2024.02.11 |
[백준/Python] 1182:부분수열의 합 (0) | 2024.02.05 |