https://www.acmicpc.net/problem/1152
1152번: 단어의 개수
첫 줄에 영어 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한
www.acmicpc.net
공백을 포함한 문자열에서 단어의 개수를 세는 문제. 공백을 기준으로 판단하면 편하지만, 앞 뒤에 나오는 공백을 피해야 한다.
공백을 포함한 문자를 입력받으려면 scanf("%[^\n]", 문자열), 또는 gets(문자열), fgets(문자열, 길이, stdin)을 사용하면 된다. 하지만 gets의 경우 버전에 따라 사용이 불가능할 수 있으므로 잘 체크하자.
필자는 이 gets를 사용하다가 컴파일에러에 걸려 fgets를 사용하였다. 하지만, 여전히 어딘가에서 논리적인 오류가 있는것 같다. 대체 무엇이 문제인건가......
#include <stdio.h>
#include <string.h>
int main () {
char a[1000001]; // 받을 문자열
int word = 0; // 단어의 개수
int ascii; // 아스키코드를 저장하기 위한 변수
// scanf("%[^\n]s", a);
// gets(a);
fgets(a, 1000000, stdin);
for (int i = 0; i < strlen(a); i++) {
ascii = a[i];
if (ascii == 32) {// 공백문자를 발견했을 때
if (i == 0 || i == strlen(a)-2) { // 그 위치가 문장의 앞이거나 뒤인 경우
continue; // 다시 돌아가자
} else { // 단어 사이에 있다면
word++; // 센다
}
}
}
printf("%d",word+1); // 공백이 n개라면 단어는 n+1개
return 0;
}
----------------------------------------- 21.08.12 -----------------------------------------
세가지를 개선하여 해결하였다.
1. fgets함수의 잘못된 사용.
2. 조건문의 간소화
3. 아스키코드에 너무 의존함.
첫번째, fget는 fgets(문자열, 길이, stdin)의 꼴로 사용한다고 했는데, 이때의 길이는 널문자를 포함해야한다. 이를 헷갈려 널문자의 길이를 고려하지 않았다.
두번째는, continue가 있는 조건문이 불필요하고, 이로 인해 조건문이 복잡하게 꼬여있어, 분산시켜 해결하기로 하였다.
원래의 for문에서는, 첫 글자와 맨 마지막 문자가 공백인 경우까지 따져가며 단어의 개수를 셌지만, 이를 분산시켜 일단 개수를 센 다음에, 첫 글자와 맨 마지막 문자가 공백이면, 1씩 빼주었다.
세번째는 개선할 점이지만, 필자의 문자열문제의 풀이의 대다수는 문자를 아스키코드로 변환하여 풀이한 문제가 대부분이다. (아마도 문자열 단계별 풀이의 첫 문제가 https://www.acmicpc.net/problem/11654여서 의존도가 올라간 것 같다.)
이를 모두 개선하여 다음과 같이 풀이하였다.
#include <stdio.h>
#include <string.h>
int main () {
char a[1000001]; // 받을 문자열
int word = 0; // 단어의 개수
// scanf("%[^\n]s", a);
// gets(a);
fgets(a, 1000001, stdin);
for (int i = 0; i < strlen(a); i++) {
if (a[i] == ' ') word++;
}
if (a[0] == ' ') word--;
if (a[strlen(a)-2] == ' ') word--;
printf("%d",word+1); // 공백이 n개라면 단어는 n+1개
return 0;
}
'coding_test > BAEKJOON' 카테고리의 다른 글
백준 5622번 C언어 풀이 (0) | 2021.08.13 |
---|---|
백준 2908번 C언어 풀이 (0) | 2021.08.12 |
백준 1157번 C언어 풀이 (0) | 2021.08.10 |
백준 2675번 C언어 풀이 (0) | 2021.08.10 |
백준 10809번 C언어 풀이 (0) | 2021.08.07 |