문제 링크: https://www.acmicpc.net/problem/1152
언뜻 보면 쉬운 문제인 것 같지만 함정이 약간 있다.
'the csharp' -> 2
' the csharp' -> 2
' the csharp ' -> 2
'' -> 0
' ' -> 0
다음과 같이 출력이 돼야 한다.
이때 양 끝 좌우 공백도 유의해야 하고, 입력으로 아무것도 입력되지 않거나 공백만 있는 경우도 유의해야 한다.
먼저 나는 다음과 같이 작성했다.
using System;
using System.Text;
internal static class Program
{
private static void Main()
{
Console.WriteLine(Console.ReadLine().WordCount());
}
private static int WordCount(this string source)
{
if (string.IsNullOrWhiteSpace(source))
{
return 0;
}
StringBuilder word = new StringBuilder();
int wordCount = 0;
for (int i = 0; i < source.Length; i++)
{
if (source[i] == ' ' && word.Length != 0 || i == source.Length - 1)
{
wordCount++;
word.Clear();
continue;
}
word.Append(source[i]);
}
return wordCount;
}
}
먼저 string.IsNullOrWhiteSpace 메서드를 사용하여 문자열이 비어있거나 공백만 있는지 확인하여 필요에 따라 0을 반환한다. 처음에 이 부분을 처리하지 않고 아래 로직을 구현하면 ' '와 같이 공백만 있는 문자열을 넣으면 0이 아닌 1을 반환하여 문제를 틀리게 된다.
이후 문자열을 반복하면서 각 문자를 공백이 나올 때까지 조합하기 위해 StringBuilder를 사용한다.
반복할 때 공백문자를 만나면 StringBuilder 인스턴스를 초기화하고 wordCount 값에 1을 더한다.
이때 문자열의 맨 처음 공백문자 처리를 위해 StringBuilder 인스턴스의 길이가 0이면 그냥 넘어간다.
마지막 단어도 계산하기 위해 i == source.Length -1 조건도 함께 추가한다. 이 조건을 처리하지 않으면 문자열의 마지막에 공백이 없는 경우 문자열의 마지막 단어를 처리하지 못하고 반복문을 빠져나가게 되어 틀린다.
마지막으로 결괏값 wordCount를 반환하면 끝.