본문 바로가기

Programming/백준 문제풀이

백준 1152번 string _ while문/cin EOF 연습 (C++)

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

 

1152번: 단어의 개수

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

www.acmicpc.net

이 문제는 c++에서 string을 어떻게 입력받는지를 아는지 모르는지에 따라 그 체감난이도가 매우 다를 것이다.
파이썬이용자라면 그냥 문자를 다 읽은 다음에 공백을 기준으로 split을 해야지! 라는 생각이 먼저 들 것 같다.

하지만 C++에서의 string은 문자열을 공백을 기준으로 입력받기 때문에, 단순히 몇번 입력받았는지만 count해도 될만큼 문제가 간단해진다.
여기서 한가지 더 고려해야할 것은 그럼 언제까지 받을지를 어떻게 설정하느냐의 문제이다.
그냥 계속 받으려면 while문을 써야할 것인데, 인풋이 종료됨을 어떻게 알 수 있을까?

이는 while(여기 안에 cin>>str을 넣어준다) 저렇게 ()안에 cin>>인풋 을 넣어줌으로써 인풋이 종료될때까지 받는다는 것을 표현할 수 있다.
또 다른 방법으로는 while(true)문 안에 if(cin.eof() == true) {break;} 를 넣음으로써 해결할 수 있다.
만약 cin이 eof(), end of file의 약자로 더 이상 인풋할 게 없으면 break;를 통해서 while문 밖으로 나갈 수 있다.

답안 코드는 다음과 같다.

// 1번 방법
#include <iostream>
using namespace std;

int main(){
    string str;
    int counter = 0;
    while (true){
        cin>>str;
        if(cin.eof() == true) {break;}
        counter +=1;
    }
    cout<<counter;
    return 0;
}

// 2번 방법
#include <iostream>
using namespace std;

int main(){
    string str;
    int counter = 0;
    while (cin>>str)
    {
        counter +=1;
    }
    cout<<counter;
    return 0;
}

 

끝!