# 문제링크
jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=788&sca=2050
Beginner_Coder 에 문자열 종류 문제다. 문장을 입력받아서 문장에 나온 단어 갯수를 출력하는 문제.
C언어 할 때와 달리 C++에는 string 형이 있어서 좀 더 편하게 구현할 수 있었던 거 같다. 문장을 단어로 나눌 때에는 strtok 을 사용했는데, 이거 사용법 좀 외워야겠다. Beginner_Coder 문제인데 삽질 좀 했다 ..
- main : 한 줄로 입력받기 cin.getline(buffer, maxsize), END 읽으면 종료- count_word : 문장을 단어로 나눠서 단어 수 세기- find_word : 이미 나온 단어인지 확인, 이미 나온 단어이면 해당 단어 인덱스를 리턴, 없는 단어면 -1 리턴- Output : 출력- remove_all : 다음 입력 처리를 위해 words 에 들어있던 거 다 지우기
# 제출 코드
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
struct WORD {
string str;
int cnt;
};
vector<WORD> words;
int find_word(char * s) {
for (int i = 0; i < words.size(); i++) {
if (words[i].str == s) return i;
}
return -1;
}
void count_word(char * s) {
const char* sep = " ";
char* token = strtok(s, sep);
while (token != NULL) {
int idx = find_word(token);
if (idx == -1) {
WORD tmp;
tmp.str = token;
tmp.cnt = 1;
words.push_back(tmp);
}
else words[idx].cnt++;
token = strtok(NULL, sep);
}
}
void Output() {
for (int i = 0; i < words.size() ; i++) {
cout << words[i].str << " : " << words[i].cnt << '\n';
}
}
void remove_all() {
int size = words.size();
for (int i = 0; i < size; i++) {
words.pop_back();
}
}
bool compare(const WORD& a, const WORD& b) {
return a.str < b.str;
}
int main(void)
{
while (true) {
char buffer[210];
cin.getline(buffer, 210);
if (strcmp(buffer, "END") == 0) break;
count_word(buffer);
sort(words.begin(), words.end(), compare);
Output();
remove_all();
}
return 0;
}
반응형
'Computer Science&Engineering > 코딩테스트' 카테고리의 다른 글
[정올 2604] 그릇 (0) | 2021.03.24 |
---|---|
[정올 2514] 문자열 찾기 (0) | 2021.03.24 |
[백준 2659] 십자카드 문제 C++ 풀이 (0) | 2021.03.24 |
[백준 2309] 일곱 난쟁이 (0) | 2021.03.22 |
[백준 11004] K번째 수 (0) | 2021.03.20 |