[백준 1152] 단어의 개수
백준 1152번 - 단어의 개수
❓ 문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
✏️ 풀이
split을 구현하면 되는 문제이다.
또한, trim까지 구현해주면 좋지만, trim은 구현하지 않고 예외 case를 생각하여 계산해주었다.
이런 문제를 풀 때면 자바나 파이썬을 선택했다면 좋았을 걸이라는 생각을 잠시 0.1초 해본다…
기존 cin >> sentence
로 input을 받는다면 안된다.
cin은 공백단위나 \0단위로 input을 자르기 때문.
따라서, getline 함수를 이용한다.
한 줄을 깔끔하게 받고 싶다면 getline(cin, sentence)
로 받을 수 있다.
또한, sstream 라이브러리를 이용하여 split를 구현할 수 있다.
이는 많이 쓰이니 암기하면 좋을 것이다!
마지막으로 시작 문자가 공백이라면 최종 vector size에 -1을 해주었다.
split 함수는 이런식으로 delimiter까지 받아들여 구현한다.
vector<string> split(string sentence, char delimiter) {
vector<string> result;
string temp;
stringstream ss(sentence);
while (getline(ss, temp, delimiter)) {
result.push_back(temp);
}
return result;
}
아래는 정답 코드이다.
✔️ 정답 코드
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
vector<string> split(string sentence, char delimiter);
int main(void) {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string sentence;
getline(cin, sentence);
int exception=0;
if (sentence[0] == ' ')
exception--;
vector<string> split_sentence = split(sentence, ' ');
cout << split_sentence.size() + exception;
return 0;
}
vector<string> split(string sentence, char delimiter) {
vector<string> result;
string temp;
stringstream ss(sentence);
while (getline(ss, temp, delimiter)) {
result.push_back(temp);
}
return result;
}
Leave a comment