코딩 테스트/백준

백준 - [단계별로 풀어보기 심화 1] 2941 크로아티아 알파벳

devrabbit22 2026. 3. 17. 03:04

이번 문제는 입력받은 문자열의 인덱스에 직접 접근하여, 해당 문자가 크로아티아 알파벳 패턴과 일치하는지 비교하는 방식으로 해결했다. 문제를 구현하는 과정에서 한 가지 놓친 부분이 있었는데, 크로아티아 알파벳을 발견했을 때 해당 알파벳의 길이만큼 인덱스를 이동시키는 처리를 하지 않았던 것이다.
이 때문에 크로아티아 알파벳을 하나의 문자로 처리하지 못하고 각각의 문자로 다시 검사하게 되어 알파벳의 개수가 실제보다 크게 계산되는 문제가 발생했다. 따라서 크로아티아 알파벳 패턴을 발견했을 경우, 해당 문자열 길이만큼 i 값을 증가시켜 이미 처리한 문자를 다시 검사하지 않도록 구현하여 문제를 해결했다.

    //백준 2941 크로아티아 알파벳
    string inputData = Console.ReadLine();
    int count = 0;

    for(int i = 0; i < inputData.Length; i++)
    {
        if (i + 1 < inputData.Length)
        {
            if (inputData[i] == 'c' && (inputData[i + 1] == '=' || inputData[i + 1] == '-'))
            {
                i++;
            }
            else if (inputData[i] == 'd')
            {
                if (inputData[i + 1] == '-')
                {
                    i++;
                }
                else if (i + 2 < inputData.Length && inputData[i + 1] == 'z' && inputData[i + 2] == '=')
                {
                    i += 2;
                }
            }
            //중복 조건은 뭉쳐서 처리
            else if ((inputData[i] == 'l' || inputData[i] == 'n') && inputData[i + 1] == 'j')
            {
                i++;
            }
            else if((inputData[i] == 's' || inputData[i] == 'z') && inputData[i + 1] == '=')
            {
                i++;
            }
        }
        count++;
    }
    Console.Write(count);
}

출력 결과 1
출력 결과 2

문제를 해결한 뒤 다른 풀이 방법이 있는지 찾아보던 중 Replace()를 활용해 더 간단하게 해결할 수 있는 방법이 있다는 것을 알게 되었다. 크로아티아 알파벳은 두 글자 또는 세 글자로 이루어진 패턴이기 때문에, 해당 패턴을 Replace()를 이용해 하나의 문자로 치환한 뒤 문자열 길이를 구하면 크로아티아 알파벳을 포함한 전체 문자 개수를 간단하게 구할 수 있다고 한다.

이 코드가 가능한 이유

Replace()가 문자열 전체를 한 번에 탐색하면서 모든 패턴을 치환하기 때문

//Replace를 활용한 방법
string inputData = Console.ReadLine();
// 크로아티아 알파벳 패턴 목록
string[] croatia = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };

// 배열에 있는 모든 크로아티아 알파벳 패턴을 순회
foreach (string s in croatia)
{
    // 해당 패턴을 "*" 한 글자로 치환
    // 크로아티아 알파벳은 여러 글자로 이루어져 있기 때문에
    // 하나의 문자로 바꿔주면 문자열 길이로 개수를 쉽게 계산할 수 있다.
    inputData = inputData.Replace(s, "*");
}

// 치환된 문자열의 길이를 출력 -> 크로아티아 알파벳을 포함한 전체 문자 개수
Console.WriteLine(inputData.Length);

크로아티아 알파벳 패턴을 하나의 문자로 치환한 뒤 문자열 길이를 구하면, 크로아티아 알파벳의 개수를 쉽게 계산할 수 있다.

동작 과정

예시로 입력이 ljes=njak일 경우 lj → *, s= → *, nj → *로 변환되어 문자열은 *e**ak가 된다.

크로아티아 알파벳이 전부 1글자로 변환된다.

치환된 문자열의 길이를 출력하면 크로아티아 알파벳을 포함한 전체 문자 개수가 된다.

주의점

크로아티아 알파벳 패턴 목록은 다음과 같다.
string[] croatia = { "c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z=" };에서 dz=, z= 이 두 개는
겹치는 패턴이다.

여기서 "dz=" 와 "z=" 은 서로 겹치는 패턴이다. 만약 "z=" 이 "dz=" 보다 먼저 검사된다면 "dz=" 을 입력받았을 때 "z=" 이 먼저 치환되어 다음과 같은 결과가 발생할 수 있다. dz= → d*

이렇게 되면 "dz=" 을 하나의 크로아티아 알파벳으로 처리하지 못하게 된다. 따라서 "dz=" 패턴이 "z=" 보다 먼저 처리되도록 배열의 순서를 지정해야 한다.

여기서 알 수 있는 점은 겹치는 패턴이 존재할 경우, 더 긴 문자열 패턴을 먼저 처리해야 한다.