-
JUNGOL 실력키우기 문자열 - 문자열 찾기 | 단어 세기보관함 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
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