[백준] 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
Author And Source
이 문제에 관하여([백준] 10820번: 문자열 분석), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@youhyeoneee/백준저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)