보관함

JUNGOL 실력키우기 문자열 - 문자열 찾기 | 단어 세기

niamdank 2020. 2. 10. 10:37

기초 다지기에서 배운 내용을 응용하여 문제를 해결해야 하는 실력 키우기입니다.

실력 키우기는 비슷한 문제 유형별로 묶어서 풀어보겠습니다.

 

이번 포스팅에서는 문자열의 단어 찾기 시리즈를 풀어보겠습니다.


2514 : 문자열 찾기

 

C++의 string 클래스에는 find라는 좋은 메소드가 포함되어 있는데 이 메소드의 오버로드를 살펴보면 문자열의 위치를 찾고 어느 인덱스 부터 찾을지를 결정할 수 있습니다.

 

이 문제는 이 메소드를 이용하여 쉽게 해결이 가능합니다.

 

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
	string str;
	cin >> str;

	string targets[2]{ "KOI", "IOI" };

	for (int i = 0; i < 2; ++i)
	{
		int index{ 0 };
		int cnt{ 0 };
		while (true)
		{
			index = str.find(targets[i], index);
			if (index == -1)
				break;
			index++; // 다음에 찾을 때 이미 찾은거 포함 안하기
			cnt++;
		}

		cout << cnt << endl;
	}
}

 

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1775&sca=2050

 

JUNGOL | 문자열 찾기 > 문제은행

출력은 2줄이며, 첫 번째 줄에는 KOI의 개수, 두 번째 줄에는 IOI의 개수를 각각 출력하라.

www.jungol.co.kr

 

1516 : 단어 세기

 

이 문제는 map<string, int>를 이용하면 쉽게 해결이 가능합니다.

가령 word라는 단어가 있다면 map[word]++; 인 경우 word의 개수가 1 증가하게 됩니다.

 

#include <iostream>
#include <sstream>
#include <map>
#include <string>

using namespace std;

int main(void)
{
	while (true)
	{
		string str;
		getline(cin, str);

		if (str == "END")
			break;

		map<string, int> wordsCount;

		string word;
		for (stringstream ss(str); ss >> word; )
		{
			wordsCount[word]++;
		}

		for (map<string, int>::const_iterator it{ wordsCount.cbegin() };
			it != wordsCount.cend();
			it++)
		{
			cout << (*it).first << " : " << (*it).second << endl;
		}
	}
}

 

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=788&sca=2050

 

JUNGOL | 단어 세기 > 문제은행

임의의 문장을 입력받아 각 단어별로 나눈 후에 단어들의 중복되는 개수를 구하는 프로그램을 작성하시오. <처리조건> (1) 입력된 스트링은 글자의 제한은 없다. 즉 공백이나 ', ' 등도 입력으로 들어 올 수 있다. (2) 입력된 문장에서 각 단어사이의 구분은 공백으로 한다. (3) 단어에는 공백을 제외한 단어들만이 포함된다. 임의의 문장을 입력받는다.(문장의 길이는 200 이하) 하나의 결과가 나온 후에도 계속 새로운 입력을 받다가, "END"가 입력되면

www.jungol.co.kr