728x90
728x90

문제

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

 

입력

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

출력

첫째 줄에 단어의 개수를 출력한다.

 

예제 입력 1

The Curious Case of Benjamin Button

 

예제 출력 1 

6

 

예제 입력 2

 The first character is a blank

 

예제 출력 2 

6

 

예제 입력 3 

The last character is a blank

 

예제 출력 3

6

 

출처

  • 문제를 만든 사람: author5
  • 데이터를 추가한 사람: clock, doju, jh05013
  • 빠진 조건을 찾은 사람: djm03178, his130
  • 내용을 추가한 사람: jh05013

 

알고리즘 분류

  • 구현
  • 문자열

 

문제 출처

https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

 


 

문제 해결 방법

문제를 해결하기 정말 까다로웠던 문제였다. (정답률 30%대...)

'공백'을 기준으로 문제를 해결하였다. 입력 받은 문자열의 요소들을 순회하면서 '공백이 아닌' 문자를 만날 경우, flag의 값을 true로 설정하였다. 그리고 공백을 만나면 단어의 개수를 담는 count 변수의 값을 1씩 증가시켰다. 그리고 다시 flag의 값을 false로 설정하였다. (공백을 만날 경우 flag의 값은 무조건 false가 되도록 조건문을 구성하였다.) 

 

하지만 문자열의 마지막 공간에 문자가 있을 경우, 문자열 배열의 마지막에 공백을 따로 넣어주지 않는다면 마지막 문자는 문자의 개수에 반영되지 않게 된다. 이러한 문제를 해결하기 위해 문자열을 입력 받은 후, push_back() 메서드를 사용하여 입력받은 문자열의 맨 마지막 공간에 공백(' ')을 넣어주었다.

 

코드

#include <iostream>
#include <string>
using namespace std;

int main() {
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    string sentence;
    bool isWord, flag;
    int count;
    
    getline(cin, sentence);
    sentence.push_back(' ');

    isWord = false;
    flag = false;
    count = 0;

    for (int i = 0; i < sentence.length(); i++) {  
        isWord = (sentence[i] != ' ');

        if (isWord) {
            flag = true;
        }
        else {
            if (flag) {
                count++;
            }
            flag = false;
        }
    }

    cout << count << endl;

    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [문자열]
728x90
728x90