Sena's garden

[백준/C언어] 1152번 단어의 개수 본문

백준/C언어

[백준/C언어] 1152번 단어의 개수

paraam02 2024. 8. 12. 23:25

 

문제

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

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.

 

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

 


 

코드

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

int main() {

	char input[1000000];
	int count = 0;

	scanf("%[^\n]s", input);

	if (strlen(input) == 1 && input[0] == ' ') {

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

	for (int i = 1; i < strlen(input) - 1; i++) {
		if (input[i] == ' ') {
			count++;
		}
	}

	printf("%d", count + 1);

	return 0;
}

 

 


 

시도

처음 코드를 시도했을 때 scanf("%s", input)을 사용했지만, 공백을 도달한 순간 입력이 끝나 버려 문장을 입력해 옳은 결과를 얻을 수 없었다. 인터넷 검색 결과 공백을 포함한 문자열을 입력받기 위해서는 %와 s 사이에 [^\n]을 넣으면 된다는 것을 새로이 알 수 있었다.

 


 

우선 scanf("%[^\n]s", input)을 이용해 공백을 포함한 문자열을 입력한다.

 

입력한 문자열의 길이가 1이고 문자열의 첫 번째 글자가 공백일 때, 즉 아무 내용없이 공백만이 존재할 때 0을 출력하고 종료한다. 여기서 문자열의 길이는 위에서 <string.h>를 불러와 strlen을 이용하여 input 문자열의 길이를 구한다. 

 

for문을 이용하여 공백 횟수를 구한다. for문에 의해 반복하며 input[i]에서 공백이 발견되면 count++을 한다.

 

코드 내에서 count는 공백의 수를 의미하고 문제에서 구해야 하는 것은 단어의 개수 이다. 그렇기 때문에 결과를 출력할 때에는 공백의 수 + 1을 하여 나타내야 한다.