김펭귄 관찰일기
article thumbnail

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

 

1152번: 단어의 개수

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

www.acmicpc.net

1. 문제


💡 문제

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

💡 입력

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

💡 출력

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

 

 

2. 풀이


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

int main(){
    int i, len;
    // 단어 수를 체크할 변수 count
    int count = 1;
    char word[1000000] = {0,};
    
    // scanf로 값을 받아올 때, '%[^\n]'를 쓰면 엔터가 입력되기 전까지의 값을 모두 가져온다.
    scanf("%[^\n]", word);
    len = (int)strlen(word);
    
    // '단어 수 = 띄어쓰기 + 1'을 바탕으로 문제를 해결할 것이다.
    
    // 만약 입력 받은 문자열이 없다면, count를 -1 해준다.
    if(len == 0) count--;
    
    // 입력 받은 문자열이 하나라면 삼항 연산자를 통해
    // 그 값이 ' '일 때 count 값에 0을, ' '이 아닐 때는 1을 저장한다.
    else if (len == 1) count = word[0] == ' ' ? 0 : 1;
    else{
    	// 인덱스 0번과 인덱스 len번을 제외한 나머지 인덱스 값들을 비교해 ' '이 체크되면 count 값을 더해준다.
        for (i = 1 ; i < len-1 ; i++){
            if(word[i] == ' ') count++;
        }
    }
    
    printf("%d\n", count);
}

 

 

3. 메모


 의외로 간단했지만, 코린이인 내겐 시간이 조금 필요한 문제였다. 나는 띄어쓰기를 포함한 문자열을 받고 싶었는데, '% s'는 공백 문자 (' ', '\0', '\n')를 만나기 전까지만 읽어오기 때문에 문장 전체를 읽어올 순 없다. 그렇다면 어떻게 해야 할까.. 구글링 해보니 금방 찾을 수 있었다. (킹갓구글... 찬양해.. 구글..)

 

%[^\n]
개행문자 ('\n')를 만나기 전까지의 모든 문자열을 받아온다.

 

char word [100] = {0,};

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

for (int i = 0, len = (int)strlen(word) ; i < len ; i++){
	printf("word [%d] : %c\n", i, word[i]);
}

 

띄어쓰기까지 잘 들어간다..!

 P.S. C언어의 문자열은 배워도 배워도 끝이 없는 것 같다. ㅠㅜ..

profile

김펭귄 관찰일기

@Penguin.Kim