본문 바로가기
백준

[백준/C++] 1181 단어 정렬

by MY블로그 2023. 4. 11.

https://www.acmicpc.net/problem/1181

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

오늘은 정렬 관련하여 복습할겸.. 관련 문제를 풀어보도록했다.

sort 사용방법은 정말 한번 얼핏 보고 복습안했던거라 검색으로 참조하였다.

 

sort 사용법과 정렬을 위한 compare 함수의 사용법을 확인할 수 있었다.

 

compare 함수에서 문자열 배열의 처음부터 끝까지 비교하는 것과

비교해서 같은순서에 문자가 아스키코드르 작은순서 정렬 시키는 것

다시한번 참조하는 아스키코드.. 

전체의 길이자체가 같지않을때 길이가 더 짧은순서로 정렬하는 부분을 이번에 새롭게 배웠다.

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#define fastio cin.tie(0)->ios::sync_with_stdio(0); cout.tie(0); // 시간단축 매크로
using namespace std;

bool compare(string a, string b) // 두개의 단어 비교 함수 (true & false)
{
    if (a.length() == b.length()) // 두단어의 길이가 같다면
    {
        for (int i = 0; i < a.length(); i++) // 시작부터 끝까지
        {
            if (a[i] != b[i]) // 같은위치의 문자가 다르다면
                return a[i] < b[i]; // a가 더 작음 으로 반환
        }
    }
    return a.length() < b.length(); // a의 길이가 더 작음으로 반환
}

int main()
{
	fastio;
    int strnum;
    string tmp;
    cin >> strnum; // 비교할 문자 갯수 입력
    vector<string> strarr; // 스트링형태의 벡터 배열
    for (int i = 0; i < strnum; i++) // 0 ~ 비교할 문자 갯수까지 반복
    {
        cin >> tmp; // 문자입력받아서
        strarr.push_back(tmp); // 배열에 푸시백
    }
    sort(strarr.begin(), strarr.end(), compare); // 비교함수를 통한 정렬 
    cout << strarr[0] << '\n'; // 한자리 문자만 처음에 출력
    for (int i = 1; i < strnum; i++)
    {
        if (strarr[i - 1] == strarr[i]) continue; // 앞자리문자와 바로뒷자리 문자가 같다면 건너뛰기
           					 // 같은 길이 같은 문자는 출력 x
        cout << strarr[i] << '\n'; // 순서대로 출력
    }
    return 0;
}

'백준' 카테고리의 다른 글

[백준/C++] 10845 큐  (0) 2023.05.03
[백준/C++] 2485 가로수 (유클리드호제법, 최대공약수)  (0) 2023.05.02
[백준/C++] 1914 하노이 탑  (0) 2023.04.25
[백준/C++] 1094 막대기  (0) 2023.04.10
[백준/C++] 1010 다리놓기  (0) 2023.04.07

댓글