Doby's Lab

[C++] 백준 1181번: 단어 정렬 (sort의 optional function) 본문

C++

[C++] 백준 1181번: 단어 정렬 (sort의 optional function)

도비(Doby) 2021. 9. 2. 00:31

이 문제가 요구하는 바는 다음과 같다.

  1. 길이가 짧은 것부터 정렬
  2. 길이가 같으면 사전 순으로
  3. 중복을 허용하지 않음
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool compare(string a, string b) {// 정렬 기준 함수 (optional function)
	return a.size() < b.size();
}

int main() {
	// 입력
	int T;
	cin >> T;
	vector<string> idx;
	for (int i = 0; i < T; i++) {
		string sample;
		cin >> sample;
		idx.push_back(sample);
	}
    
	//크기가 작은 순으로 정렬
	sort(idx.begin(), idx.end(), compare);
	
	/*
    크기가 같을 때 사전순으로 정렬할 코드
    */
	
    //출력
	for (int i = 0; i < T; i++) {
		cout << idx[i] << '\n';
	}

	return 0;
}

크기가 같을 때 사전순으로 정렬할 코드를 고민하다가

compare에서 option을 더 추가할 수는 없을까를 생각했다.

 

bool compare(string a, string b) {
	if (a.size() != b.size()) {
		return a.size() < b.size();
	}
	else {
		return a < b;
	}
}

기존의 compare에서는 크기만 비교할 수 있게 했다면

크기가 다를 때는 크키별로 정렬하고, 같을 때는 사전순으로 정렬할 수 있게 해주었다.

 

결론적으로 이 문제에서 얻을 수 있었던 것은

sort의 optional function을 통해 조건을 더 추가할 수 있었다는 점이다.


정답

+여담

중복을 허용하지 않는다는 조건에서 어떻게 vector의 중복을 처리할 수 있을까

여러 방법을 생각하다가 stack을 하나 선언에서 기존에 vector의 데이터를 가져오자라는 생각을 했는데

(기존의 자료와 동일하다면 push할 때 전의 것을 pop을 하는 형태로)

출력에서 stack이 에러가 났었다.

Q: stack은 인덱스 번호를 매길 수 없을까?

> 답을 아신다면 댓글을 남겨주세요😂😂

(+ 2021-11-05 추가내용

첫 문제풀이 포스팅이었네😮😮

오랜만에 예전 포스팅들 보다가 질문에 대한 답을 적는다.

A: 스택은 인덱스 번호 못 매긴다.

)

#include <iostream>
#include <vector>
#include <algorithm>
#include <stack>

using namespace std;

bool compare(string a, string b) {
	if (a.size() != b.size()) {
		return a.size() < b.size();
	}
	else {
		return a < b;
	}
}

int main() {
	int T;
	cin >> T;
	vector<string> idx;
	for (int i = 0; i < T; i++) {
		string sample;
		cin >> sample;
		idx.push_back(sample);
	}

	sort(idx.begin(), idx.end(), compare);

	for (int i = 0; i < T; i++) {
		if (i == T - 1) {
			cout << idx[i] << '\n';
			continue;
		}
		if (idx[i] == idx[i + 1]) {
			continue;
		}
		else {
			cout << idx[i] << '\n';
		}
	}

	return 0;
}

결론적으로 출력할 때, 출력하자마자 즉각적으로 중복을 처리하게끔 조건을 걸어주었다.

중복을 처리하는 부분이 주관적으로 난잡하다는 생각이 든다.

 

Q2: 중복을 처리할 때 더 깔끔하게 할 수 있는 방법이 있을까요??

728x90