

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


문제를 해결한 뒤 다른 풀이 방법이 있는지 찾아보던 중 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=" 보다 먼저 처리되도록 배열의 순서를 지정해야 한다.
여기서 알 수 있는 점은 겹치는 패턴이 존재할 경우, 더 긴 문자열 패턴을 먼저 처리해야 한다.
'코딩 테스트 > 백준' 카테고리의 다른 글
| 백준 - [단계별로 풀어보기 심화 1] 25206 너의 평점은 (0) | 2026.03.18 |
|---|---|
| 백준 - [단계별로 풀어보기 심화 1] 1316 단어 체커 (0) | 2026.03.18 |
| 백준 - [단계별로 풀어보기 심화 1] 1157 단어 공부 (0) | 2026.03.16 |
| 백준 - [단계별로 풀어보기 심화 1] 2444 별 찍기 -7 (0) | 2026.03.16 |
| 백준 - [단계별로 풀어보기 심화 1] 10988 팰린드롬인지 확인하기 (0) | 2026.03.15 |