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

[Baekjoon] 20920번: 영단어 암기는 괴로워

by 섬댕이 2023. 7. 9.

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

 

20920번: 영단어 암기는 괴로워

첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단

www.acmicpc.net

 


 

문제 해결 과정

착안

문자열을 키로 가지며, 등장하는 빈도 수를 값으로 저장하여 문제를 해결하고자 std::map<>과 같은 컨테이너를 활용하고자 하였다. 이때 키의 자료형이 문자열 형이므로 해시 테이블(hash table)을 사용하는 것이 일반적으로 속도 측면에서 유리하기 때문에 std::unordered_map<> 클래스를 사용해 데이터를 입력받아 저장한 다음 std::vector<> 클래스를 활용해 정렬하여 결과를 출력하고자 하였다.

 

구현

문제에서 주어진 정렬 우선순위 대로 람다 표현식(lambda expression)을 이용해 정렬함으로써 문제를 해결하였다.

* 참고) 처음 문제를 해결하면서 std::vector<>로 데이터를 옮길 때 반복문을 통해 옮겼는데, 이 과정이 시간적으로 비효율적임을 확인하여 std::vector<> 클래스의 오버로딩 된 생성자를 사용해 데이터를 옮긴 다음 정렬하였다.

 

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

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

using namespace std;

unordered_map<string, int> Words;

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

	int N, M = 0;
	cin >> N >> M;

	while (N--)
	{
		string str;
		cin >> str;

		if ((int)str.size() < M)
			continue;

		Words[str]++;
	}

	vector<pair<string, int>> Sorted(Words.begin(), Words.end());
	sort(Sorted.begin(), Sorted.end(),
	     [&](const pair<string, int>& pair1, const pair<string, int>& pair2)
	     {
		     if (pair1.second == pair2.second)
		     {
			     if (pair1.first.size() == pair2.first.size())
				     return pair1.first < pair2.first;

			     return pair1.first.size() > pair2.first.size();
		     }
		     return pair1.second > pair2.second;
	     });

	for (const pair<string, int>& pair : Sorted)
		cout << pair.first << "\n";

	return 0;
}

 

실행 결과

댓글