관리 메뉴

cococo-coding

[C++ 풀이] 1181번. 단어 정렬 본문

[BOJ] 코드 모음/C++_learning 문제집

[C++ 풀이] 1181번. 단어 정렬

_dani 2024. 1. 22. 22:01

문제 분석 요약

n개의 단어를 입력받아 

1. 길이가 짧은 애들 먼저

2. 길이가 같다면 사전 순으로 정렬

3. 중복은 없어야 함

위 세가지 조건들을 만족해서 한줄에 하나의 단어씩 출력하는 문제이다.

알고리즘 설계

단어를 저장할 string형 벡터를 선언하고, 크기는 n으로 설정한다.

n번만큼 단어를 입력받아 벡터에 쌓는다.

 

위의 세가지 조건들을 구현하기 위해 sort정렬을 이용할건데, 

기본적으로 sort(v.begin(), v.end())와 같이 쓰면 사전순으로 오름차순 정렬이 된다.

그렇지만 우리는 그전에 길이순 정렬이 먼저이므로, sort의 세번째 인자인 cmp를 추가해서 길이순 정렬을 구현한다.

sort(v.begin(), v.end(), cmp);

cmp는 메인함수 이전에 다음과 같이 정의했다.

bool cmp(string a, string b) {
    if (a.length() == b.length()) {
        return a < b; //a와 b의 길이가 같은 경우는 사전순(오름차순)으로
    }
    else {
        return a.length() < b.length();
    }
}

리턴값은 bool형이고, string형인 매개변수 a,b를 받는다.

만약 a와 b의 길이가 같다면 오름차순(a<b)으로 리턴하고,

길이가 다르다면 길이가 짧은 순으로(a.length<b.length) 리턴한다. 

 

코드

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool cmp(string a, string b) {
    if (a.length() == b.length()) {
        return a < b; //a와 b의 길이가 같은 경우는 사전순(오름차순)으로
    }
    else {
        return a.length() < b.length();
    }
}

int main() {
    //1
    int n;
    cin >> n;

    //2
    vector <string> v(n);
    for (int i = 0; i < n; i++) {
        cin >> v[i];
    }

    //3
    sort(v.begin(), v.end(), cmp);
    cout << v[0] << '\n';
    for (int i = 1; i < n; i++) {
        if(v[i]!=v[i-1])
        cout << v[i] << '\n';
    }

    return 0;
}

느낀점 

sort정렬에 세번째 인자를 통해 내가 원하는 형식으로 정렬할 수 있다.