본문 바로가기

코딩 테스트/백준

[백준 1152번 문제, C] 단어의 개수

728x90
반응형

문제

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율

 

2 초 128 MB 302070 95671 76555 32.413%

문제

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

입력

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

 


코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>    // strlen (문자열 길이 체크용)
#include <ctype.h>    // isspace (공백문자 체크용)

char* trim(char*);

int main() {
	char line[1000000];

    // 입력
	scanf("%[^\n]", line);

    // 문자열 앞, 뒤 공백 제거
    char *line_result = trim(line);

    // trim을 하면 공백을 제거하는데 문자열 길이가 0이면 0 반환
    if (strlen(line_result) == 0) {
        printf("%d\n", 0);
        return 0;
    }
    else {
        // 단어 개수를 저장할 변수
        int answer = 0;

        // 문자열 개수만큼 반복
        for (int i = 0; i < strlen(line_result); i++) {
            // 문자열에서 현재 보고 있는 문자가 공백이면 +1
            if (line_result[i] == ' ') {
                answer++;
            }
        }

        // 공백의 개수를 세었는데 출력은 단어의 개수를 요구하니 +1
        printf("%d\n", answer + 1);
        return 0;
    }
}


char* trim(char* str) {
    // 문자열의 앞쪽 공백 제거
    while (isspace(*str)) {
        str++;
    }

    // 문자열의 뒤쪽 공백 제거
    int len = strlen(str);
    while (len > 0 && isspace(str[len - 1])) {
        str[--len] = '\0';
    }

    return str;
}

해결

앞, 뒤 공백을 제거하고 문장의 중간에 있는 공백의 개수를 센다


참고

링크

 

 

 

728x90
반응형