https://www.acmicpc.net/problem/1152
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언어의 문자열은 배워도 배워도 끝이 없는 것 같다. ㅠㅜ..
'프로그래밍 > 백준 알고리즘' 카테고리의 다른 글
[C] 다이얼 (백준 알고리즘 5622번) (0) | 2021.07.26 |
---|---|
[C] 상수 (백준 알고리즘 2908번) (0) | 2021.07.24 |
[C] 단어공부 (백준 알고리즘 1157번) (0) | 2021.07.23 |
[C] 문자열 반복 (백준 알고리즘 2675번) (0) | 2021.07.23 |
[C] 알파벳 찾기 (백준 알고리즘 10809번) (0) | 2021.07.23 |