목표
영어 대소문자와 띄어쓰기만으로 이루어진 문자열이 주어집니다. 이 문자열에 몇 개의 단어가 있는지 구해야합니다. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 세어야 합니다.
주의
단어는 띄어쓰기 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 문자열의 앞과 뒤에 공백이 있을 수 있다. 중복된 단어가 나오면 중복 횟수도 세어야한다.
입력과 출력
입력 첫 줄
: 대소문자와 띄어쓰기로 이루어진 문자열이 주어진다.
출력 첫 줄
: 단어의 개수를 출력한다.
예제
1) 예제 입력
: The Curious Case of Benjamin Button
1) 예제 출력
: 6
2) 예제 입력
: (공백)Mazatneunde Wae Teullyeoyo
2) 예제 출력
: 3
풀이(1)
1. 공백을 기준으로 문자열을 쪼갠다.
2. 쪼갠 문자열을 배열에 담는다.
3. 배열의 인덱스를 출력한다.
코드
string input = Console.ReadLine();
string[] words = input.Split(' ');
input: string에 문자열을 입력받습니다. 입력받은 문자열을 Split()함수를 통해 (공백)을 기준으로 쪼갭니다. 쪼갠 자료들을 words: string[]에 집어넣습니다.
Console.WriteLine(words.Length);
배열의 크기를 출력합니다.
공백을 기준으로 쪼개다보니, 단어를 구분짓지 않는 공백이 존재할 경우 배열의 크기가 단어의 갯수와는 상관없이 커져버린다는 문제점이 생깁니다. 이를 수정해봅시다.
풀이(2)
1. 공백을 기준으로 문자열을 쪼갠다.
2. 쪼갠 문자열을 배열에 담는다.
3. 배열 내에서 공백으로만 구성된 인덱스를 제거하거나 체크해야한다.
4. 제거했으면 그대로 배열의 길이를 출력하고 체크했으면 체크한 갯수만큼 배열의 길이에서 뺀다.
5. 배열의 인덱스를 출력한다.
코드
static int CheckSpaceIndexCount(string[] words)
{
int count = 0;
for (int i = 0; i < words.Length; i++)
{
if (words[i] == "")
{
count++;
}
}
return count;
}
문제 해결을 위해서 저희는 공백이 중복됐을때 이 공백 인덱스를 총 길이에서 제외시켜야합니다. 그러기 위해선 공백이 배열에 몇 개가 들어있는지 카운트해야합니다. 이러한 기능을 가진 CheckSpaceIndexCount()함수를 만들어줬습니다.
int SpaceIndexCount = CheckSpaceIndexCount(words);
Console.WriteLine(words.Length - SpaceIndexCount);
만든 함수를 가지고 공백을 카운트한 값을 받습니다. 그리고 배열의 길이에서 공백 카운트 값을 빼주기만 하면 실제 단어가 있는 배열의 개수를 파악할 수 있습니다.
정상적으로 출력됩니다.
코드 전문 보기
using System;
class Program {
static void Main(string[] args)
{
string input = Console.ReadLine();
string[] words = input.Split(' ');
int SpaceIndexCount = CheckSpaceIndexCount(words);
Console.WriteLine(words.Length - SpaceIndexCount);
}
static int CheckSpaceIndexCount(string[] words)
{
int count = 0;
for (int i = 0; i < words.Length; i++)
{
if (words[i] == "")
{
count++;
}
}
return count;
}