본문 바로가기
C++ 코딩 문제 풀이/백준

[Baekjoon] 1181번: 단어 정렬

by 섬댕이 2023. 6. 11.

 

 

 

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

 

1181번: 단어 정렬

첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.

www.acmicpc.net

 


 

문제 해결 과정

착안

정렬에 사용할 비교 연산자를 람다 표현식(lambda expression)을 활용한 이항 조건(binary predicate)으로 정의하여 문제를 해결하고자 하였다.

 

구현

편의상 STL의 <algorithm> 헤더에 포함되어있는 std::sort() 함수를 사용하여 정렬하되, 람다 표현식을 활용해 이항 조건을 정의한 다음 함수에 전달하여 문제를 해결하였다.

* 어제 포스팅했던 문제와 동일한 원리의 문제여서 오늘은 별도로 정렬 함수를 직접 만들어 풀어보지는 않음.

 

한편, 중복된 문자열의 출력을 피하기 위해 정렬된 배열의 요소를 순차적으로 출력하는 과정에서 이전 출력과 같은 문자열일 경우는 출력하지 않도록 조건문을 추가하였다.

 

[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~

더보기
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string Strings[20000];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int N;
	cin >> N;

	for (int i = 0; i < N; i++)
		cin >> Strings[i];

	sort(&Strings[0], &Strings[N - 1] + 1,
	     [](const string& a, const string& b)
	     {
		     if (a.length() == b.length())
			     return a < b;
		     return a.length() < b.length();
	     });

	string temp;
	for (int i = 0; i < N; i++)
		if (Strings[i] != temp)
			cout << (temp = Strings[i]) << "\n";

	return 0;
}

 

실행 결과

댓글