티스토리 뷰
요약
비교 커스텀 함수를 짜서 주어지는 값을 담은 컨테이너를 요구조건에 맞게 정렬한다.
1) 길이 오름차순
2) 사전순
✔️ 중복 제거
자료형
vector<string> 을 사용했다.
풀이 순서
1. 값 입력
int n;
cin >> n;
cin.ignore(); // getline을 위한 첫 \n 무시
vector<string> strvec;
for(int i = 0; i < n; i++) {
string str = "";
getline(cin,str);
if(strvec.end() == find(strvec.begin(),strvec.end(),str)) { //중복 제거
strvec.push_back(str);
}
}
if문에서 find를 이용해 중복일 경우 push_back을 하지 않게끔 한다.
2. 값 정렬
algorithm 헤더의 sort 함수를 이용한다.
커스텀 함수를 이용한다.
길이는 length(), 사전순은 비교연산자를 이용하였다.
bool cmp(string a, string b) {
if(a.length() != b.length()) { //1. 길이
return a.length() < b.length();
} else { //2. 길이가 같다면 사전순
return a < b;
}
}
길이가 다르다면 길이 기준 오름차순,
길이가 같다면 사전순이다.
a<b라는 조건식 하에,
a가 b보다 사전상 앞이라면 1 -> True
뒤라면 0 -> False
외에 strcmp나 compare를 사용해도 된다.
3. 정렬된 값 출력
for(auto item : strvec) {
cout << item << '\n';
}
코드
#define LOCAL
#include <bits/stdc++.h>
using namespace std;
// 알파벳 소문자로 이루어진 N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬하는 프로그램을 작성하시오.
// 길이가 짧은 것부터
// 길이가 같으면 사전 순으로
// 단, 중복된 단어는 하나만 남기고 제거해야 한다.
bool cmp(string a, string b) {
if(a.length() != b.length()) { //1. 길이
return a.length() < b.length();
} else { //2. 길이가 같다면 사전순
return a < b;
}
}
int main() {
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif
cin.tie(0) -> sync_with_stdio(0);
int n;
cin >> n;
cin.ignore(); // getline을 위한 첫 \n 무시
vector<string> strvec;
for(int i = 0; i < n; i++) {
string str = "";
getline(cin,str);
if(strvec.end() == find(strvec.begin(),strvec.end(),str)) { //중복 제거
strvec.push_back(str);
}
}
sort(strvec.begin(),strvec.end(),cmp);
for(auto item : strvec) {
cout << item << '\n';
}
return 0;
}
다른 사람의 풀이
다른 사람들도 대부분 vector와 sort및 custom compare를 이용한 것으로 보인다.
다른 방식의 풀이는 발견하지 못했다.
'■ 알고리즘 > ◻ 백준' 카테고리의 다른 글
[C++]1541번: 잃어버린 괄호 (0) | 2023.02.26 |
---|---|
[C++]1427번: 소트인사이드 (0) | 2023.02.26 |
[C++]9020번: 골드바흐의 추측 (0) | 2022.10.26 |
[C++]1929번: 소수 구하기 (0) | 2022.10.26 |
[C++]10757번: 큰 수 A+B (0) | 2022.10.25 |