[Algoritm] 1181 단어정렬

gunggme·2023년 11월 25일

알고리즘

목록 보기
24/42

시작

이 문제는 간단해 보이지만, 생각보다 그냥 풀면 시간 초과가 나는 문제다. 그렇다면 한번 풀어보자. 우선 문제의 예외 사항부터 살펴보도록 할텐데 예외사항은 이렇다

예외사항

  1. 중복이 있으면 안됨
  2. 길이가 짧은거부터 정렬
  3. 길이가 같으면 사전 순

이런식으로 예외 사항이 있는데, 우선 가장 중요한 "중복"제거를 먼저 해줘야 되겠다. 그렇다면 cpp에서는 중복 제거를 위해 먼저 사전순으로 정리를 해야 된다. 중복을 삭제하기 위한 함수는 erease하고 unique를 사용해주면 되며, 나머지 순서 정렬은 bool함수를 만들어 관리를 해주면 된다.

코드

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>

using namespace std;

bool compare(string s1, string s2) {
	// 만약 길이가 같으면 사전순 정렬
	if (s1.size() == s2.size()) return s1 < s2;
	// 아니면 글자 순서로 정렬
	else return s1.size() < s2.size();
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	int n, wordsize;
	string temp;
	cin >> n;
	vector<string> words(n);
	for (int i = 0; i < n; i++) {
		cin >> words[i];
	}
	//일단 사전순으로 정렬
	sort(words.begin(), words.end());
	// 중복 삭제
	words.erase(unique(words.begin(), words.end()), words.end());
	wordsize = words.size();
	// 다시 compare함수로 정렬
	sort(words.begin(), words.end(), compare);
	for (int i = 0; i < wordsize; i++) {
		cout << words[i] << "\n";
	}
}
profile
안녕하세요!

0개의 댓글