백준 웹사이트 "1152번 - 단어의 개수" 문제풀이입니다.
언어는 C언어입니다. (제출 언어: C99)
문제
소스 코드
#include <stdio.h>
#include <string.h>
int main(void){
char sentence[1000001];
scanf("%[^\n]s", sentence);
//printf("%s\n", sentence);
int len = strlen(sentence);
int space_cnt = 0;
for(int i=0; i<len; i++){
if(sentence[i] == ' '){ // c에서는 ' '가 공백
if(i!=0 && i!=len-1)
space_cnt++;
if(len==1)
space_cnt=-1; //공백만 있을 경우, '1'이 출력되지 않도록
}
}
printf("%d\n", space_cnt+1);
}
문제 풀이
이 문제에서 가장 어려운 부분은 input을 받는 부분인 것 같습니다. Line 5, 6가 이에 해당되는데, Line 6의 입력 방식이 이전 문제들과 다릅니다. 이전과 같이 "%s"를 이용하면 공백을 만났을 때 입력이 끊기므로, 공백을 포함한 전체 문자열을 입력받기 위해 대신에 "%[^\n]s"를 이용합니다. %[]를 '스캔셋 (scanset)'이라고 하며, 이를 이용해 특정 문자 (또는 문자 범위)를 지정하면 scanf 함수가 이를 고려하여 스캔을 합니다.
대괄호의 사이에 있는 '^\n'의 의미부터 해석해봅시다. '^' 문자는 그 뒤에 나오는 문자들을 제외한다는 의미이며, \n은 줄바꿈 문자 (개행 문자)로 이미 익숙할 것입니다. 따라서 ^\n은 '줄바꿈 문자를 제외한다'는 뜻이 됩니다. 이를 스캔셋을 이용하여 "%[^\n]s"와 같이 표현한다면, 줄바꿈 문자를 만나기 전까지 스캔이 지속되고, 만나면 스캔을 종료하라는 뜻이 됩니다. 따라서 공백으로 분리된 단어들을 모두 스캔하여 입력받을 수 있게 됩니다.
그 후, Line 9 ~ 18은 전체 공백의 개수를 구하는 코드입니다. 이 문제에서 역시 '시간 초과' 오류가 뜰 가능성이 있으므로, Line 9에서 strlen 함수를 이용하고 for문에서는 제외시켜줍니다. for문에서는 전체 input의 문자들을 하나씩 확인해보며, 공백일 경우 'space_cnt' 변수를 1씩 증가시켜주며 전체 공백의 개수를 세어줍니다. 물론, 공백이 맨 처음이나 맨 끝에 있을 경우는 제외시켜야겠죠? 최종적으로 문제가 원하는 것은 공백의 개수가 아닌 단어의 개수이므로, 공백의 개수에 1을 더하여 출력합니다.
마지막으로 주의할 것은, 예제만으로 잡히지 않는 경우가 존재한다는 것입니다. 바로 빈 공백 " "만 입력될 경우인데요, Line 15, 16을 추가해주지 않으면 공백만 있을 경우 단어는 0개임에도 불구하고 1이 출력됩니다 (저도 이 케이스 때문에 처음에 틀렸습니다ㅠㅠ). 따라서 입력의 길이가 1이고 그 입력이 공백일 경우에 한해서, space_cnt를 -1로 지정하여 마지막 출력문에서 0이 출력되도록 합니다.
'코딩 > 백준 BOJ' 카테고리의 다른 글
[백준/C언어] 5622번 - 다이얼 (0) | 2022.01.12 |
---|---|
[백준/C언어] 2908번 - 상수 (0) | 2022.01.11 |
[백준/C언어] 1157번 - 단어 공부 (0) | 2022.01.10 |
[백준/C언어] 2675번 - 문자열 반복 (0) | 2022.01.09 |
[백준/C언어] 10809번 - 알파벳 찾기 (0) | 2022.01.08 |