백준/단계별

백준 2941 C#) 크로아티아 알파벳

alpacadabra 2022. 4. 27. 01:03

다른 문자열은 괜찮은데 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 알고리즘을 써도 풀 수 있겠지만 아직은 단계가 낮으니까 천천히 사용해보자.