본문 바로가기

컴퓨터/백준 알고리즘

백준 알고리즘 1152번: 단어의 개수 C언어

문체 출처: www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

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

www.acmicpc.net

1. 코드

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

int main(void)
{
    int i, len, cnt = 0;
    char arr[1000000];
    
    scanf("%[^\n]", arr);
    len = strlen(arr);
    
    /* 공백 문자 하나만 입력 시 0으로 출력 후 종료 */
    if(len == 1)
    {
    	if(arr[0] == ' ')
        {
            printf("0\n");
    		return 0;
        }
    }
    
    /* 공백 문자 갯수 인식 */
    for(i = 1; i < len-1; i++)
    {
        if(arr[i] == ' ')
            cnt++;
    }
    
    printf("%d\n", cnt + 1);
    return 0;
}

2. 문제 해결 과정

일단 %[^\n]을 이용해서 문자열을 입력받았는데 이것은 scanset를 이용한 것인데 그것의 의미는 \n을 제외하고 모든 것들을 입력한다는 의미이다. 그리고 이것을 이용하여 공백을 포함한 모든 문자를 입력받고 공백 문자를 인식하면 횟수를 증가시키고 횟수보다 1 증가시킨 값을 출력하면 된다.

그런데 예제를 볼 때 마지막에 띄어쓰기를 하거나 문자를 입력하기 전에 처음에 띄어쓰기를 하는 경우(ex : " Mazatneunde Wae Teullyeoyo", "Teullinika Teullyeotzi ")가 있어서 공백 문자의 횟수를 확인할 때 맨 앞부분과 뒷부분을 제외시켰다.

그래도 실패를 할 것인데 공백 문자 하나만 입력을 하는 데이터가 있어서 입력받은 문자가 1개일 때 그것이 공백이라면 0으로 출력하게 하였다.

이렇게 문제를 해결했다.

3. 느낀 점

scanset에 대한 문제가 가끔씩 나와 조금 자세하게 알아보고 싶다는 생각이 들었다. 지금 추측하는 것은 ^를 쓰면 반대의 의미를 갖는다는 것과 [] 안에 있는 문자만 인식하는 것이다. 내가 모르는 다른 방법이 여러 가지 존재할 것 같아 나중에 천천히 알아보아야겠다.