[백준 C] 1152 : 단어의 개수

anfruf·2022년 6월 20일

백준 C언어

목록 보기
50/62
  1. C언어 : 문자열(6)

21.JUN.2022

문제 : 문자열

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

문제 풀이

#include <stdio.h>
#include <string.h>

int main()
{
	char str[1000000]; 
	int len, count = 1;

	scanf("%[^\n]s", str); // scanset : 범위까지만 입력 받기 
	len = strlen(str);

	if (len == 1 && str[0] == ' ') { // 공백 하나만 입력됐을 때
		printf("0");
		return 0;
	}

	for (int i = 1; i < len-1; i++) { // 문장의 처음과 끝에 공백을 세지 않기
		if (str[i] == ' ')
			count++;
	}

	printf("%d", count);
	return 0;
}

scanf로 공백이 있는 문자열을 입력받아 출력하면 첫 번째 공백 후로는 출력하지 않고 맨 처음 단어 하나만 달랑 나온다. 공백을 포함한 문자열을 출력하고 싶으면 범위를 지정해 출력해야 한다.
위의 코드에서는 scanset으로 범위를 지정해 출력하였다. [ ] 안에 범위를 지정하면 되는데, ^ 표시를 붙이면 뒤에 입력되는 범위는 받지 않겠다는 뜻이다.

ex)
[A-Z] : A~Z의 범위만 받겠다. (ABCabc 입력 --> ABC만 출력)
[^A-Z] : A~Z의 범위를 받지 않겠다. (abcABC 입력 --> abc만 출력)

따라서 위에서 쓰인 [^\n] 범위는 개행을 제외한 모든 문자를 받겠다는 의미이다.

0개의 댓글