치춘짱베리굿나이스

[백준] 1152 단어의 개수 본문

C C++/알고리즘풀이

[백준] 1152 단어의 개수

치춘 2021. 9. 2. 13:36

단어의 개수

문제

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

입력

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

출력

첫째 줄에 단어의 개수를 출력한다.

풀이

#include <stdio.h>
#include <stdlib.h>

int    main(void)
{
    char    *str;
    char    *str_backup;
    int        count;

    count = 0;
    str = (char *)malloc(sizeof(char) * 1000000);
    str_backup = str;
    scanf("%[^\n]", str);
    if ((*str >= 'a' && *str <= 'z')
        || (*str >= 'A' && *str <= 'Z'))
        count++;
    while (*(str + 1))
    {
        if (*str == ' '
            && ((*(str + 1) >= 'a' && *(str + 1) <= 'z')
                || (*(str + 1) >= 'A' && *(str + 1) <= 'Z')))
            count++;
        str++;
    }
    printf("%d", count);
    free(str_backup);
}

반성회

굳이 malloc이랑 free할 필요가 있었을까..?

다른 사람들이 푼 걸 보니까 굳이 동적할당 말고 read를 통해 표준입력을 받아온 예시도 있었다 (어차피 길이는 고정이니께...)

read 표준입력은 생각도 못했는데 (바본가?) 동적할당 안 쓰고 이 방법도 꽤 요긴하겠다 싶었다

왜냐면 scanf는 메모리 할당이 충분히 안 되어 있으면 값을 쓰다가 세그멘테이션 오류가 나기도 하고.. %[^\n] 이용해야 \n 외의 모든 문자 (공백 포함) 를 받아올 수 있기 때문에 공백을 같이 받아오려면 이걸 써야하더라

오늘도 또 희한한거 알아갑니다... 알아도 알아도 끝이없는 c의 세계... 남의 코드 보는것도 나쁘지않은듯

'C C++ > 알고리즘풀이' 카테고리의 다른 글

[백준] 1330 두 수 비교하기  (0) 2021.09.02
[백준] 1157 단어 공부  (0) 2021.09.02
[백준] 1008 A / B  (0) 2021.09.01
[백준] 10998 A * B  (0) 2021.09.01
[백준] 1001 A - B  (0) 2021.09.01
Comments