https://www.acmicpc.net/problem/1181
정수 N이 주어지고 N개의 줄에 걸처 소문자로 이루어진 알파벳을 단어를 한줄에 하나씩 입력한다.
이때 조건은 다음과 같다.
1. 길이가 짧은 순서대로
2. 길이가 같으면 사전 순으로 (a>b>c)
3. 중복된 단어는 하나만 남기고 삭제
코드
#include <iostream>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
using namespace std;
//N개의 단어가 들어오면 아래와 같은 조건에 따라 정렬
//1. 길이가 짧은 것 부터
//2. 길이가 같으면 사전 순으로, a,b,c
//중복된 단어는 하나만 남기고 제거
bool compare(pair<int, string>a, pair<int, string>b)
{
if (a.first == b.first)
{
return a.second < b.second;
}
else
{
return a.first < b.first;
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int N;
string S;
cin >> N;
vector<pair<int, string>> arr;
for (int i = 0; i < N; i++)
{
cin >> S;
arr.push_back(make_pair(S.size(), S));
}
sort(arr.begin(), arr.end(), compare);
//arr 벡터 처음부터 끝까지 정렬, 문자열 사전순
arr.erase(unique(arr.begin(), arr.end()), arr.end());
//중복 제거
for (int i = 0; i < arr.size(); i++)
//i < N; => i < arr.size()
//중복된 값을 지우고 난 후에는 벡터의 길이가 짧아지기에 arr.size로 변경해주어야 한다.
{
cout << arr[i].second << "\n";
}
return 0;
}
설명
입력한 단어의 길이를 구별해놓고 비교하기 위해 2차원 벡터로 구현하였다. (vector<pair<int, string>>)
그 후 입력한 단어들을 짧은 순서대로 정렬하되 길이가 같을 경우에는 사전 순으로 정렬되게
사용자 지정 함수를 추가하였다. ("bool compare()")
정렬 후 중복되는 배열을 삭제하고 정렬된 배열을 출력하였다.
'Algorithm' 카테고리의 다른 글
[C++] BaekJoon 1931 회의실 배정 (0) | 2024.04.09 |
---|---|
[C++] BaekJoon 1874 스택 수열 (2) | 2024.03.19 |
[C++] BaekJoon 9095 1, 2, 3 더하기 (0) | 2023.10.27 |
[C++] BaekJoon 1463 1로 만들기 (0) | 2023.10.26 |
[C++] BaekJoon 10184 나이순 정렬 (0) | 2023.10.15 |