치춘짱베리굿나이스
[백준] 1152 단어의 개수 본문
단어의 개수
문제
영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
입력
첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 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