본문 바로가기
백준

[1181번] 단어 정렬

by 2744m 2019. 3. 13.
1181번: 단어 정렬
 
www.acmicpc.net
/*1181번 단어 정렬*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int N;
string in;
vector<string>v;
vector<pair<int,string>>out;
pair<int, string>temp;
int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> in;
		v.push_back(in);
	}
	sort(v.begin(), v.end());//입력 받은것을 정렬해서
	v.erase(unique(v.begin(), v.end()),v.end());//중복 제거
	//단어의 길이와 단어를 저장하는 벡터에 넣어줌
	for (int i = 0; i < v.size(); i++) {
		temp = { v[i].size(),v[i] };
		out.push_back(temp);
	}
	sort(out.begin(), out.end());//pair를 정렬하면 first 기준으로 정렬되고, 다음으로 second기준으로 정렬이 된다.
	for (int i = 0; i < out.size(); i++) {
		cout << out[i].second << '\n';
	}
}

이 문제는 입력값들의 중복요소를 제거하고 2가지 기준으로 정렬을 해야한다.

중복요소 제거는 unique 함수와 vector의 erase를 이용해서 제거를 하였다.

이 문제에서 정렬 우선순위를 살펴보면 첫번째가 단어의 길이이고, 두번째가 단어의 사전적 순서다.

그래서 pair를 이용해 first에 단어의 길이, second에 단어를 저장해서 sort하였다.

조금 더 올바른(?) 풀이법은 sort함수 3번째 인자에 직접 비교함수를 작성해서 넣어주면 된다.

bool cmp(string a,string b) {
	return a.size() < b.size() || a.size() == b.size() && a < b;
}

 

'백준' 카테고리의 다른 글

[1874번] 스택 수열  (0) 2019.03.15
[10867번] 중복 빼고 정렬하기  (0) 2019.03.13
[1026번] 보물  (0) 2019.03.12
[10828번] 스택  (0) 2019.03.12
[10815번] 숫자카드  (0) 2019.03.11

댓글