백준 2941번

CharliePark·2020년 9월 28일
0

TIL

목록 보기
50/67

BOJ 2941 : 크로아티아 알파벳

문제 자체도 생각할 거리가 있었고, 구현시에도 유의할 부분이 있었다

먼저 알파벳을 하나씩 읽어들이면서 카운트하는게 원칙이지만, 크로아티안 알파벳으로 인해 한번에 두개나 세개를 읽을 때도 생기게 된다.

여기서 카운트는 하나이고, 읽어들이는 개수만 2개, 3개로 달라지는 것에서 착안할 수 있다

중첩된 for 문 안에서 크로아티안 알파벳과 str 값을 인덱스 i와 i+1을 통해 비교하고, 만약 크로아티안 알파벳과 동일하다면 i++로 i 값을 1 증가시켜주면 두개를 읽은 것과 마찬가지가 된다.

중첩된 for 문을 벗어나면 동일하게 count++로 count 값을 하나만 늘려주면, 알파벳 한 개로 센 것이 된다.

이때 크로아티안 알파벳에서 "dz="가 세글자인게 문제가 된다.

"dz="를 제외하고는 어떤 알파벳이나 크로아티안 알파벳 뒤에도 '=' 가 단독으로 올 수 없으므로, 크로아티안 알파벳 앞자리 두자리가 같은 상태에서 그 다음 문자로 '='가 등장하면 그것은 "dz=" 로 확인하도록 했다.

이 확인 과정은 맞았으나, 문제는 크로아티안 알파벳이 아닌 부분에서 발생했다.

만약 "dzz"와 같이 알파벳 세개로 읽어내야 하는 상황에서도, 앞의 두 문자가 "dz=" 의 'd', 'z'와 같아서 if 문을 벗어날 때 i++ 처리되는 현상을 발견했다. 따라서 else if로 j==2 임을 확인해, 지금 읽어낸 게 "dz" 일때 뒤에 '=' 이 오지 않는 상황에서 i++이 처리되지 않도록 break 를 설정했다. 물론 가장 안에 중첩된 if-if else 문과 바로 아래의 i++ 간의 순서도 중요하다.


#include <stdio.h>
#include <string.h>

int main()
{
    const char* croatian[] = { "c=" , "c-" , "dz=", "d-", "lj", "nj", "s=", "z=" };

    char str[101] = "";

    while (scanf("%s", &str) != 1) continue;
    
    char str_len = strlen(str);

    char count = 0;

    for (int i = 0; i < str_len; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            if ( (str[i] == croatian[j][0]) && (str[i + 1] == croatian[j][1]) )
            {
                if (str[i + 2] == '=')
                    i++;
                else if (j == 2)
                    break;
                i++;
                break;
            }
        }
        count++;
    }

    printf("%d", count);
}

0개의 댓글