C++
[C++] 백준 1181번: 단어 정렬 (sort의 optional function)
도비(Doby)
2021. 9. 2. 00:31

이 문제가 요구하는 바는 다음과 같다.
- 길이가 짧은 것부터 정렬
- 길이가 같으면 사전 순으로
- 중복을 허용하지 않음
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(string a, string b) {// 정렬 기준 함수 (optional function)
return a.size() < b.size();
}
int main() {
// 입력
int T;
cin >> T;
vector<string> idx;
for (int i = 0; i < T; i++) {
string sample;
cin >> sample;
idx.push_back(sample);
}
//크기가 작은 순으로 정렬
sort(idx.begin(), idx.end(), compare);
/*
크기가 같을 때 사전순으로 정렬할 코드
*/
//출력
for (int i = 0; i < T; i++) {
cout << idx[i] << '\n';
}
return 0;
}
크기가 같을 때 사전순으로 정렬할 코드를 고민하다가
compare에서 option을 더 추가할 수는 없을까를 생각했다.
bool compare(string a, string b) {
if (a.size() != b.size()) {
return a.size() < b.size();
}
else {
return a < b;
}
}
기존의 compare에서는 크기만 비교할 수 있게 했다면
크기가 다를 때는 크키별로 정렬하고, 같을 때는 사전순으로 정렬할 수 있게 해주었다.
결론적으로 이 문제에서 얻을 수 있었던 것은
sort의 optional function을 통해 조건을 더 추가할 수 있었다는 점이다.
정답
+여담
중복을 허용하지 않는다는 조건에서 어떻게 vector의 중복을 처리할 수 있을까
여러 방법을 생각하다가 stack을 하나 선언에서 기존에 vector의 데이터를 가져오자라는 생각을 했는데
(기존의 자료와 동일하다면 push할 때 전의 것을 pop을 하는 형태로)
출력에서 stack이 에러가 났었다.
Q: stack은 인덱스 번호를 매길 수 없을까?
> 답을 아신다면 댓글을 남겨주세요😂😂
(+ 2021-11-05 추가내용
첫 문제풀이 포스팅이었네😮😮
오랜만에 예전 포스팅들 보다가 질문에 대한 답을 적는다.
A: 스택은 인덱스 번호 못 매긴다.
)
#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
bool compare(string a, string b) {
if (a.size() != b.size()) {
return a.size() < b.size();
}
else {
return a < b;
}
}
int main() {
int T;
cin >> T;
vector<string> idx;
for (int i = 0; i < T; i++) {
string sample;
cin >> sample;
idx.push_back(sample);
}
sort(idx.begin(), idx.end(), compare);
for (int i = 0; i < T; i++) {
if (i == T - 1) {
cout << idx[i] << '\n';
continue;
}
if (idx[i] == idx[i + 1]) {
continue;
}
else {
cout << idx[i] << '\n';
}
}
return 0;
}
결론적으로 출력할 때, 출력하자마자 즉각적으로 중복을 처리하게끔 조건을 걸어주었다.
중복을 처리하는 부분이 주관적으로 난잡하다는 생각이 든다.
Q2: 중복을 처리할 때 더 깔끔하게 할 수 있는 방법이 있을까요??