컴굥일지

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

알고리즘/코테 문제

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

gyong 2022. 4. 10. 00:05
반응형

문제

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

백준 1181
백준 1181

 

문제 내용

단어를 입력받아서 조건에 따라 정렬하여 출력하면 된다.

1. 길이가 짧은 것부터
2. 길이가 같으면 사전 순으로

** 단, 같은 단어는 1번만 출력한다 (중복 제거하기)**

 

문제 풀이

조건 1, 2는 그냥 vector로 입력받아서 정렬 기준을 새로 정해서 sort()하면 되었었다.

다만, 추가 조건에 중복을 제거하라고 했기 때문에 set을 사용해서 문제를 풀었다.

 

set에서 정렬의 기준을 바꾸려면 구조체를 선언하여 비교를 해야 한다.

그리고 vector처럼 정렬을 나중에 sort()를 써서 하는 것이 아니라, 애초에 set을 선언할 때 두 번째 인자로 미리 만든 구조체를 넣어 주어야 한다.

 

코드

#include <iostream>
#include <algorithm>
#include <set>
using namespace std;

//set의 정렬 기준을 바꾸기 위해 구조체 선언 및 operator() 오버로딩
struct sorting {
	bool operator() (const string& a, const string& b) const {
		if (a.size() == b.size()) //길이가 같으면 사전순
			return a < b;
		else
			return a.size() < b.size(); //길이가 다르면 길이순
	}
};


int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	//입력
	int n; string tmp;
	cin >> n;
	set<string, sorting>ss; //두번째 인자에 정렬기준

	//문제 해결
	for (int i = 0; i < n; i++) {
		cin >> tmp;
		ss.insert(tmp);
	}

	//결과 출력
	for (auto str : ss) cout << str << '\n';
	
}

반응형
Comments