코딩테스트/BOJ

[BOJ/C++] 1181::단어 정렬 (정렬)

HONGGG 2023. 12. 1. 01:13

문제

 

입력

 

출력

 

예제입력

 

예제출력

 


후기

중복처리를 해주어야 하는 것을 깜빡해서 2번 정도 실패했다.

 

이번에도 중복 값을 제거하기 위해 몇가지 실험을 해보았다.

 

벡터의 경우 선형 컨테이너이기에 역시 빠른 처리가 가능했지만, 자체 정렬 기능은 없어서 따로 정렬을 해주어야 한다.

set의 경우 자동 정렬은 하지만, 트리 컨테이너이기에 훨씬 느리고 많은 공간을 사용하였다.

 

이 문제에서는 둘중 뭐가 좋냐 물으면 역시 벡터가 더 좋다고 본다.

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <set>

using namespace std;

typedef vector<string>::iterator striter;


// 	4932KB	24ms
#pragma region SetSolution
struct CustomCompare {
    bool operator() (const string& first, const string& second) const {
        if (first.size() == second.size()) {
            return strcmp(first.c_str(), second.c_str()) < 0 ? true : false;
        }
        return first.size() < second.size();
    }
};

void UsingSet(){
    int loop = 0;
    cin >> loop;

    set<string, CustomCompare> letters;

    while (loop--) {
        string letter;
        cin >> letter;
        letters.insert(letter);
    }

    for (set<string>::iterator iter = letters.begin(); iter != letters.end(); iter++) {
        cout << *iter << '\n';
    }
}
#pragma endregion SetSolution

// 	3980KB	20ms
#pragma region VecterSolution
bool compare(const string& first, const string& second) {
    if (first.size() == second.size()) {
        return strcmp(first.c_str(), second.c_str()) < 0 ? true : false;
    }
    return first.size() < second.size();
}
    
void UsingVector(){
    int loop = 0;
    cin >> loop;

    vector<string> letters(loop);

    for (int k = 0; k < loop; k++) {
        cin >> letters[k];
    }

    sort(letters.begin(), letters.end(), compare);
    striter endPoint = unique(letters.begin(), letters.end());

    for (striter iter = letters.begin(); iter != endPoint; iter++) {
        cout << *iter << '\n';
    }
}
#pragma endregion VectorSolution


int main(void) {
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);

    UsingVector();

    return 0;
}