티스토리 뷰

문제 링크 : https://www.acmicpc.net/problem/1152

 

1152번: 단어의 개수

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

www.acmicpc.net

문제 |

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

 

입력 |

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

 

출력 |

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

#include <stdio.h>
#include <iostream>
using namespace std;

int main(void) {
	char ch[1000000] = { 0, };
	cin.getline(ch, 1000000);

	int count = 0;
	for (int i = 1; i < 1000000; i++)
	{
		if (ch[i] == ' ')
			count++;
		else if (ch[i-1] != 0 && ch[i - 1] != ' ' && ch[i] == 0)
			count++;
	}
	cout << count << endl;
	return 0;
}

내가 아직까지 제일 꺼려하는 문제인 문자열 문제다. 문자열 문제를 꺼려하는 이유는 문자를 배열에 넣고 하나씩, 혹은 단어 단위로 자유자재로 빼는게 훈련이 부족하기 때문이다. 그래서 다른 문제들보다 문자열이 등장하면 굉장히 문제가 어렵게 느껴진다. 심지어 글자 하나 입력받고 그거 그대로 출력하는 문제도 나에게는 많이 무겁게 느껴진다.

 

각설하고 코드 리뷰로 들어가겠다. 이 문제는 내가 테스트 케이스를 하나씩 돌릴 때마다 문제가 발생했다. 일단 처음으로 돌려서 맞춘 테스트 케이스는 가장 긴 문장인 'The Curious Case of Benjamin Button'이다. 이 문장의 단어의 개수를 세기 위하여 나는 공백을 기준으로 코드를 작성했다. 공백이 있으면 단어가 하나 있다는 뜻이고, 만약 공백 없이 0이 등장하면 마지막으로 단어 개수를 하나 더 추가시키는 방식이었다. 이렇게 기준을 잡고 작성했을 때 첫 번째 테스트 케이스의 6이라는 출력 결과는 손쉽게 나왔다.

 

문제는 두 번째에서 바로 발생했다. 두 번째 입력문인 ' Mazatneunde Wae Teullyeoyo'는 앞의 첫 번째 케이스와는 다르게 문장 앞에 공백이 있는 경우이다. 이렇게 되면 공백만큼 개수를 세는 데다가 마지막에 하나 더 개수를 세어주니 단어의 개수가 4개라고 출력 결과가 나와버린다. 이 부분은 문제의 조건을 활용해 처리했다. 공백은 띄어쓰기 하나로 구성되며, 이 공백은 연속해서 나오지 않는다는 점이다. 그래서 단어가 무조건 2번째 칸(ch[1])부터는 존재한다는 점을 이용해 거기서부터 공백의 여부를 확인했다.

 

세 번째에서도 문제가 발생했는데 이 경우는 문장의 맨 뒤에 공백이 한 칸 존재하는 경우였다. 문장의 단어 사이사이에 있는 공백을 모두 계산한 후 마지막 단어의 개수를 포함시키기 위해 개수를 하나 더 증가시켜주는 알고리즘의 허점을 공격하기 딱 좋은 테스트 케이스였다. 이 케이스는 내가 배열 전체를 처음에 0으로 초기화시킨 것을 이용해서 처리했다. 마지막으로 검사하는 글자의 전 글자가 0이 아니며, 공백도 아니고, 현재 검사하고 있는 글자가 0인 경우에 단어의 개수를 증가시켰다.

 

이 3가지 테스트 케이스를 모두 해결하고나니 변수 없이 곧바로 정답 처리되었다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함