[백준] 10820번: 문자열 분석

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

문제

알고리즘 접근 방법

각각 비교를 통해 문자를 구분한다.
N이 입력되지 않음으로, eof를 이용하여 종료조건을 잘 받아야 한다.

오답

while (!cin.eof())
    {
        getline(cin, s)
        ...
    }

이런 식으로 처음에 했는데 안되었다.

이유는

마지막 줄을 읽고나면 마지막 줄 뒤에 달려있는 줄바꿈 문자만 읽고 getline이 종료하기 때문에 eof인지는 확인하지 않는다. 따라서 루프가 한 번 더 돈다.

정답

while (getline(cin, s))
    {
        ...
    }

읽단 읽으려고 시도를 하고 안 되면 종료하기 때문에 딱 맞게 돈다.

풀이

#include <iostream>
#include <string>

using namespace std;


int main(){

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

    string S;

    while (getline(cin, S))
    {
        int num[4] = {0, }; // 소문자, 대문자, 숫자, 공백의 개수
        for (int j=0; j<S.length(); j++){
            char c = S[j];
            // 소문자 ?
            if (c >= 'a' && c <= 'z')  
                num[0]++;
            // 대문자 ?
            else if (c >= 'A' && c <= 'Z')
                num[1]++;
            // 숫자 ?
            else if (c >= '0' && c <= '9')
                num[2]++;
            //공백 ?
            else if (c == ' ')
                num[3]++;    
        }

        for (int j=0; j<4; j++){
            cout << num[j] << ' ';
        }
        cout << '\n';
            
    }

    return 0;
}

정리

eof 주의합쉬다..

💡 참고 포스팅

종료조건에서 질문사항이 있습니다 !!
checking for eof in string::getline

좋은 웹페이지 즐겨찾기