[백준/BOJ] 백준 1501번 : 영어 읽기

2021. 11. 20. 16:31알고리즘 문제풀이

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

 

1501번: 영어 읽기

첫째 줄에 사전에 있는 단어들의 개수 N(0 ≤ N ≤ 10,000)이 주어진다. 다음 N개의 줄에는 각 줄에 하나씩, 영어 사전에 있는 단어들이 주어진다. 각 단어의 길이는 100자를 넘지 않는다. 다음 줄에

www.acmicpc.net

사전에 있는 단어를 "첫 번째 문자 + 첫 번째, 마지막 문자를 제외한 문자열을 정렬한 문자 + 마지막 문자"로 unordered_map에 등장 개수와 함께 저장한다. 그리고 해석할 문자열을 입력받아 stringstream을 이용하여 공백별로 쪼개어 문자들을 구하고 각각의 문자에 매치되는 개수를 확인하여 문제를 해결했다.

 

코드

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <unordered_map>
#include <sstream>
using namespace std;

int n, m;
unordered_map<string, int> word;

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	cin >> n;
	cin.ignore();

	for (int i = 0; i < n; i++)
	{
		string input;
		cin >> input;
		cin.ignore();

		if (input.size() > 3)
		{
			char left = input[0];
			char right = input[input.size() - 1];
			string mid_input = input.substr(1, input.size() - 2);
			sort(mid_input.begin(), mid_input.end());
			string insert_word = left + mid_input + right;

			if (word.count(insert_word) == 0)
				word.insert(make_pair(insert_word, 1));
			else
				word[insert_word]++;
		}

		else
		{
			if (word.count(input) == 0)
				word.insert(make_pair(input, 1));
			else
				word[input]++;
		}
	}

	cin >> m;
	cin.ignore();

	for (int i = 0; i < m; i++)
	{
		string input;
		getline(cin, input);

		int result = 1;

		//' '기준으로 단어 나눠서 check에 넣기
		vector<string> check;
		stringstream ss(input);
		string temp;
		while (getline(ss, temp, ' '))
		{
			//if (temp.size() == 0)
			//	continue;
			check.push_back(temp);
		}

		for (int i = 0; i < check.size(); i++)
		{
			string this_word = check[i];

			if (this_word.size() <= 3)
			{
				if (word.count(this_word) == 0)
					result *= 0;
				else
					result *= word[this_word];
			}

			else
			{
				char left = this_word[0];
				char right = this_word[this_word.size() - 1];
				string mid_this_word = this_word.substr(1, this_word.size() - 2);
				sort(mid_this_word.begin(), mid_this_word.end());
				string check_word = left + mid_this_word + right;

				if (word.count(check_word) == 0)
					result *= 0;
				else
					result *= word[check_word];
			}
		}

		cout << result << "\n";
	}


	return 0;
}