전체 코드
#include <iostream>
int main()
{
char S[1000001];
int count = 0, idx = 0;
std::cin.getline(S, 1000001);
while (S[idx] != '\0')
{
if (S[idx]==' ')
count++;
idx++;
}
count++;
if (S[0] == ' ')
count--;
if (S[idx-1] == ' ')
count--;
std::cout << count;
}
풀이
- char 배열 선언, 단어는 1000000글자를 안넘는다하지만 글자끝에 항상 '\0'이 들어가는것을 고려해서 다음과 같이 선언
- std::cin.getline : 위 함수로 입력받으면 공백이 나와도 끊기지 않고 그대로 입력받을 수 있음, 인자로 배열과 배열 크기를 넣는다.
char S[1000001];
std::cin.getline(S, 1000001);
- (여기까지는 앞이나 뒤에 공백이 생기는 예외 없다고 가정하고 코딩)
- 문자열 끝을 나타내는 '\0'을 만날때까지 반복
- 공백을 만나면 count를 1씩 늘린후 다음 값을 검사하기위해 idx를 1씩 늘림
- 단어의 개수는 공백의 개수에 +1값을 하면 올바른 단어개수가 나오게 되므로 count에 1씩 더함
while (S[idx] != '\0')
{
if (S[idx]==' ')
count++;
idx++;
}
count++;
- (여기부터는 앞과 뒤에 공백 들어가는 예외가 생길 가능성을 두고 코딩)
- 앞에 공백이 있는 경우 count값을 하나 뻄, 앞의 공백은 배열의 인덱스가 0인 값을 검사하면 알 수 있음
- 뒤에 공백이 있는 경우 count값을 하나 뺌, 뒤의 공백은 idx-1값을 검사하면 알 수 있음(지금 idx는 '\0'값을 가리키기 때문에 실제 뒤의 값을 구하려면 1을 빼야함)
if (S[0] == ' ')
count--;
if (S[idx-1] == ' ')
count--;