[BOJ] 1152_단어의개수

gogori6565·2022년 7월 22일
0

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

💡 key point
: (입력에서) 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.


풀이
💡 key point를 유의해서 풀자.
1. 문장에서 앞, 뒤 공백을 배제하고 문장의 단어의 개수는 (띄어쓰기(공백))+1 이다.
2. 맨 앞과 맨 뒤의 공백은 카운트하지 않고 오로지 문장 내의 공백만 카운트 한 뒤 +1 한 값을 출력한다.

  • 맨 앞과 맨 뒤의 글자를 검사하지 않는다.

    • 검사하지 않아도 문제될 것이 없다. "I"와 같은 한 글자 단어가 맨 앞이더라도 "I" 바로 뒤 공백이 카운트 되어 올바르게 단어 카운팅이 가능하다.
  • 오로지 문장 내의 띄어쓰기만 cnt에 카운트해준다. 이 cnt+1의 값이 문장 내 단어의 개수가 된다.

  • 🛑 단, 주의할 것이 있다. 문장이 " " 공백 하나만 입력되었을 경우 1이 출력되는 오류를 범할 수 있으니 이 경우 0이 올바르게 출력되게 조건 걸어주자.


풀이 코드

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

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

    string s;
    getline(cin,s); //공백도 입력받음 (개행에서 끝)

    int cnt=0;
    for(int i=1;i<s.size()-1;i++)
    {
        if(s[i]==' ')
            cnt++;
    }

    if(s==" ")
        cout<<cnt; //0 출력
    else
        cout<<cnt+1;

    return 0;
}

string 변수도 맨 뒤 값은 NULL이 들어간다.
s[s.size()] 를 출력해보면 아무것도 출력되지 않는 것을 알 수 있다.
따라서, s의 맨 뒤는 s.size()-1 이라고 보고 이 이전까지만 검사하도록 for문을 작성해야한다.


문제 출처 : https://www.acmicpc.net/problem/1152

profile
p(´∇`)q

0개의 댓글