기초 PS #boj 1152

0ne·2024년 1월 28일

Algorithm

목록 보기
4/22

문제

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

입력

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

출력

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

풀이

중요한 점은 공백에 대한 조건이다.
공백이 앞뒤에 존재하는 경우, 모두 공백인 경우를 생각할 수 있는지가 포인트이다.

단순한 '여부'일 때에는 boolean을 이용하는 것이 유리하다.

1. 전부 공백인 경우에 대한 처리

2. 일반적인 경우에 대한 처리

ㄱ. word여부를 false로 초기화 : bool isWord = false
ㄴ. 문자열의 모든 char를 순회하면서 isWord를
' '이 아닐때만 true로 바꾼다.
' '인 경우에는 false로 설정한다.
true이면서 isWord가 참일 때에만 한번 count를 올린다.(참이 처음 되는 그 경우만 세게 됨 즉, ' '이 아닌 모든 경우에 count가 올라가지 않음)

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

int main() {
    string str;
    getline(cin, str);

    // 1. 모든 문자가 공백인 경우에 대한 처리
    bool allSpaces = true;
    for (char ch : str) {
        if (ch != ' ') {
            allSpaces = false;
            break;
        }
    }
    if (allSpaces) {
        cout << 0;
        return 0;
    }
    //2. 일반적인 경우에 대한 처리
    int count = 0;
    bool inWord = false;

    for (char ch : str) {
        if (ch != ' ') {
            if (!inWord) {
                inWord = true;
                count++;
            }
        } else {
            inWord = false;
        }
    }

    cout << count;
    return 0;
}
profile
@Hanyang univ(seoul). CSE

0개의 댓글