[백준 1152] 단어의 개수

백준 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