티스토리 뷰

Source

문제

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

입력

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

출력

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

예제 입력 1

The Curious Case of Benjamin Button

예제 출력 1

6

예제 입력 2

 Mazatneunde Wae Teullyeoyo

예제 출력 2

3

예제 입력 3

Teullinika Teullyeotzi 

예제 출력 3

2

해설

간단한 문제다. 띄어쓰기(스페이스)로 구분되는 단어의 개수를 알아내야 한다. 즉 입력받은 문자열에서 스페이스의 개수를 세어 1을 더하면 단어의 개수가 된다. 그런데 주의해야 할 점은 입력받은 문자열의 맨 처음과 끝에도 무의미한 스페이스가 포함되어 있을 수 있다. 이 경우 적절하게 스페이스의 개수를 감산해 주면 된다.

참, scanf() 함수의 용법에 관련해 알아두어야 할 부분이 있다. scanf()는 기본적으로 ' ', \0, \n에서 입력이 중단뙨다. 따라서 이 문제와 같이 공백이 포함된 문자열을 전체를 입력받을 수 없다. 따라서 그 대안으로 \n만을 입력 중단점으로 하는 fgets() 함수를 사용할 수 있다. 이 함수는 세 개의 인자를 가지고 있다. 인자는 ⓐ 배열의 이름 ⓑ 최대 입력 길이 ⓒ 입력받을 스트림의 파일 객체(여기서는 표준 입력에 해당하므로 stdin)으로 본 코드에서는 fgets(input_string, 1000000, stdin);이 된다.

굳이 저처럼 scanf()를 꼭 써야겠다는 경우에는 서식문자에서 정규직 표현을 이용하여 이 문제에서 원하는 입력을 받을 수 있다. scanf()의 서식 문자는 %으로 시작하는 d, f, s, c가 아닌 정규직 표현을 사용할 수 있다. 죽 [^\n]라고 지정하면 \n(개행문자)만을 제외하곤 모두 입력을 받으란 의미가 된다. 정규식 표현에서는 []은 찾고자 하는 패턴이나 범위를 지정할 수 있는데 그 앞에 ^을 주게 되면 해단 패턴이나 범위는 제외한다는 의미로 바뀐다.

  1. 입력받은 문자열(input_string)에서 스페이스의 개수를 센다(space).
    for (i = 0; i < len; ++i) {
        if (input_string[i] == ' ') {
            space += 1;
        }
  1. 문자열의 맨 앞(first_space)과 끝(end_space)에 스페이스가 있는 경우 위 단어 수에서 각각 1을 뺀다.
    if (input_string[0] == ' ')
        first_space = 1;
    if (input_string[len - 1] == ' ')
        end_space = 1; 

이 코드를 완성하여 확정된 단어 수(words)를 출력한다.

소스코드: C

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char input_string[1000000];
    int i, len, words, space = 0, first_space = 0, end_space = 0;

    scanf("%[^\n]", input_string);
    /** fgets(input_string, 1000000, stdin); */
    len = strlen(input_string);

    if (input_string[0] == ' ')
        first_space = 1;
    if (input_string[len - 1] == ' ')
        end_space = 1; 

    for (i = 0; i < len; ++i) {
        if (input_string[i] == ' ') {
            space += 1;
        }
    }

    words = space - first_space - end_space + 1;

    printf("%d\n", words);


    return 0;
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
11-26 00:00