티스토리 뷰

요약

비교 커스텀 함수를 짜서 주어지는 값을 담은 컨테이너를 요구조건에 맞게 정렬한다.

 

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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함