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

+ Recent posts