목록으로
백준

BOJ - [String - 10820 문자열 분석] - BRONZE II 🥉

https://www.acmicpc.net/problem/10820 이문제는 string헤더에서 strlen으로 문자열 길이를 가져오는 것과 문자열을 입력받을때 공백까지 한줄씩 안전하게 불러오기 위해 scanf(%s,...); 를 안쓰고

1분 읽기

문제

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

설명

이문제는 string헤더에서 strlen으로 문자열 길이를 가져오는 것과 문자열을 입력받을때

공백까지 한줄씩 안전하게 불러오기 위해 scanf("%s",...); 를 안쓰고

gets(변수);를 썼다는 점 말고 크게 특별한 점은 없었고

문제에 티어만 봐도 문제가 없을 것으로 판단되었다.

그러나

문제는 백준을 포함한 온라인 저지에서 주로 요구하는 조건. ***EOF(End Of File)***을 입력받아 프로그램을 종료하는 조건이었다.

scanf() 함수에 경우 문자열 입력에 실패, 즉 입력된 파일(문자열 복붙한거 같은거 포함)의 끝이 확인되면 함수 자체적으로 EOF를 리턴하게 되는데

gets는 모르고 있어서 이번에 찾아볼 수 있는 기회가 되었다.

gets는 scanf함수와 다르게 EOF가 아니라 **NULL값('\0')**을 반환한다는 것을 확인하였다.

따라서 while(gets(변수)!=NULL)\{...\}를 확용하면 파일의 끝이 감지될때까지 입력을 계속 이어나가도록 할 수 있었다.

참고 자료 : https://codedragon.tistory.com/2208 문제 : https://www.acmicpc.net/problem/10820

코드

#include <stdio.h>
#include <string.h>
int main() {
    char inp[100],n_cap=0,cap=0,num=0,blank=0;
    
    while(gets(inp) != NULL)
    {
        n_cap=cap=num=blank=0;
        for(int i=0; i<strlen(inp); i++)
        {
            n_cap += (inp[i]<='z'&&inp[i]>='a')?1:0;
            cap += (inp[i]<='Z'&&inp[i]>='A')?1:0;
            num += (inp[i]<='9'&&inp[i]>='0')?1:0;
            blank += (inp[i]==' ')?1:0;
        }
        printf("%d %d %d %d\n",n_cap,cap,num,blank);
    }
    return 0;
}

댓글