

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
string sString;
int n;
cin >> n;
set<string> m_setString;
for (int i=0; i<n; i++)
{
cin >> sString;
m_setString.emplace(sString);
}
vector<string> m_vecString(m_setString.begin(), m_setString.end());
// 길이가 짧은 것부터
// 길이가 같으면 사전순으로
sort(m_vecString.begin(), m_vecString.end(), [](const string& _a, const string& _b)
{
if (_a.size() > _b.size())
{
return false;
}
else if (_a.size() == _b.size())
{
if (_a > _b)
{
return false;
}
else
return _a < _b;
}
else
return true;
});
for(auto& iter : m_vecString)
{
cout << iter << "\n";
}
return 0;
}
해당 문제의 접근할 때의 순서 정리
1. 문자열이면서 중복을 허락하지 않으므로 set 자료 구조 생각
2. set 자료구조는
- set은 연관 컨테이너라서 항상 정렬된 상태(기본은 std::less<T> 오름차순)로 저장된다.
- 내부 순서를 정하는 비교자는 컨테이너 생성 시점에 정해지며, 요소는 const 이라 재배치가 불가.
- 그리고 std::sort는 임의 접근 반복자가 필요한데, set의 반복자는 양방향 반복자라 요구 조건을 만족하지 못한다.
라는 조건으로 sort 알고리즘을 사용하지 못함
3. set 자료형을 vector 자료형으로 전환
4. sort 함수의 pred 조건 제어문을 Lamda 문을 활용하여 순서 재배치
-> false 면 순서 재배치 , true면 순서 그대로 유지 ( 기억하기)
5. auto 문을 통한 출력.
'Coding Test > Sort' 카테고리의 다른 글
| 프로그래머스 [Level2] 전화번호 목록 [Sort, Hash] (0) | 2025.11.09 |
|---|---|
| 프로그래머스 [Level1] 달리기 경주 (0) | 2025.11.04 |
| 프로그래머스 [PCCE 기출문제] 10번 / 데이터분석 (0) | 2025.11.04 |
| 백준 1427번 소트인사이드 (0) | 2025.11.04 |