다른 문자열은 괜찮은데 dz=가 조금 골치아프다.
int cnt = 0;
bool flag = false;
string s = Console.ReadLine();
for (int i = 0; i < s.Length; i++)
{
if (i + 1 < s.Length)
{
switch ((s[i], s[i + 1]))
{
case ('c', '='):
case ('c', '-'):
case ('d', '-'):
case ('l', 'j'):
case ('n', 'j'):
case ('s', '='):
continue;
case ('d', 'z'):
flag = true;
continue;
case ('z', '='):
if (flag) flag = false;
continue;
}
}
cnt++;
if (flag)
{
cnt++;
flag = false;
}
}
Console.Write(cnt);
2개의 문자를 한번에 검사한다.
continue 문을 만나지 않는 경우, 즉 크로아티아 알파벳이 아닌 경우에는 2개의 문자로 계산이 된다.
그러나 크로아티아 알파벳일 경우에는 continue 문을 접하고 1개로만 계산이 될 것이다.
예를 들어 문자열 "c=d"에서 "c="는 크로아티아 알파벳이므로 계산을 하지 않고 다음 인덱스로 이동한다.
그러면 검사하는 문자열은 "=d"가 되는데 이는 크로아티아 알파벳이 아니므로 cnt를 1 증가시킨다.
그리고 다음이자 마지막 문자인 'd'는 길이가 1이므로 검사 없이 cnt를 1 증가시킨다.
따라서 단어의 개수 cnt는 2가 된다.
기본적인 원리는 그러하나 dz=가 조금 특이하다.
d가 나온 후 z=가 이어서 나온다면 상관없지만 그냥 z가 나올 수도 있기 때문에 예외 처리에 신경써야 한다.
따라서 dz가 나왔을 경우 별도의 flag를 통해 z=를 검사한다.
만약 z=가 아니라면 dz 또한 별개의 문자였다는 뜻이므로 cnt를 한번 더 증가시켜야 할 것이다.
Replace 메소드나 KMP 알고리즘을 써도 풀 수 있겠지만 아직은 단계가 낮으니까 천천히 사용해보자.
'백준 > 단계별' 카테고리의 다른 글
백준 2292 C#) 벌집 (0) | 2022.04.27 |
---|---|
백준 1316 C#) 그룹 단어 체커 (0) | 2022.04.27 |
백준 1152 C#) 단어의 개수 (0) | 2022.04.22 |
백준 1157 C#) 단어 공부 (0) | 2022.04.22 |
백준 11720 C#) 숫자의 합 (0) | 2022.04.21 |
댓글