https://www.acmicpc.net/problem/1181
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
0. 개요
이번 문제의 조건은 다음과 같습니다.
1. 길이가 짧은 것 부터
2. 길이가 같으면 사전순으로
3. 여러번 입력된 단어는 한 번만 출력한다
길이가 같으면 사전순으로 정렬하는 것은 sort 함수가 처리 해 줄테니 1, 3번만 고려하면 되겠습니다.
1. 소스 코드
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
bool compare(string a, string b) {
if (a.length() == b.length()) return a < b;
else return a.length() < b.length();
}
int main(void) {
string arr[200000];
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
sort(arr, arr + n, compare);
for (int i = 0; i < n; i++){
cout << arr[i] << "\n";
while (!arr[i].compare(arr[i + 1]))
i++;
}
return 0;
}
1. compare 함수를 통하여 길이가 짧은 순으로, 길이가 같으면 사전순으로 먼저 정렬해줍니다.
2. 중복되는 문자열의 경우 다음번의 문자열과 비교하여 같다면 반복에 사용되는 변수 i를 1 증가하므로써 건너뛰는 효과를 주어 해결했습니다.
2. 마무리
정렬과 같이 저명한 파트는 이미 구현된 훌륭한 알고리즘이 너무 많습니다.
따라서 문제 풀이 시간도 자연스럽게 줄어들었습니다.
'백준 온라인 저지 - 단계별로 풀어보기 > 정렬' 카테고리의 다른 글
| 11650 - 좌표 정렬하기 (0) | 2021.08.24 |
|---|---|
| 2750 - 수 정렬하기 (0) | 2021.01.10 |