본문 바로가기
CS/Coding Test

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

by bona.com 2024. 1. 26.

 

이 문제가 비교적 쉬울지라도 나는 문자열이 나오는 문제를 어려워했기 때문에 이번에는 기록해두고 싶어서 적어본다.

 

우선 문자열을 입력받고 그것을 길이 순으로 지정하는 방법에 대해 고민해보았다.

이때 유용하게 사용할 수 있는 방법이 있는데, C++의 <algorithm>헤더에서 제공해주는 sort() 함수이다. 

 

sort() 함수는 정렬할 범위를 알고, 그 범위 내의 각 요소 쌍에 대한 함수를 호출할 수있다.

 

즉, 아래의 코드에서 보았을 때 str[] 배열에 있는 각 요소에 대해 compare() 함수의 입력으로 사용하고 있는 것을 알 수 있다.

이 비교 결과에 따라 요소의 위치를 재배치한다.

#include<iostream>
#include<algorithm>
#define MAX 20000
using namespace std;
bool compare(string x, string y);
int main(void)
{
	int N;
	cin >> N;

	string str[MAX];
	
	for (int i = 0; i < N; i++) {
		cin >> str[i];
	}

	sort(str, str + N, compare);

	for (int i = 0; i < N; i++) {
		if (str[i] == str[i + 1]) continue;
		 cout << str[i] << endl;
	}

	return 0;
}
bool compare(string x, string y) {

	if (x.length() == y.length()) return x < y;
	else return x.length() < y.length();

}

 

이제 compare() 함수를 살펴보자!

 

매개변수인 x와 y의 길이가 같으면 x < y를 return 하는 것을 볼 수 있다. 이는 x가 y보다 사전 상에서 앞에 오는지 확인하는 조건이다. 

만약, y가 사전 상으로 먼저 온다면, false를 반환할 것이고, str[] 배열에서 두 문자열의 위치를 바꾸게 될 것이다.

 

💡여기서 또 주목해볼 점은,

return 값에 true, false를 따로 지정해주는 것이 아니라 
boolean으로 판단이 되는 식을 집어넣었다는 점이다.

 

이를 잘 사용한다면 코드가 한결 간결해질 것 같다.

 

그리고 항상 고민인 것이 배열로 풀지, vector로 풀지인데 이 문제같은 경우, 중복 출력을 허용하지 않기 때문에 vector로 풀었어도 좋았을 것 같다는 생각이 든다.