

한번에 처리할 좋은 방법이 보이지 않습니다.
저는 크로아티아 알파벳을 제거하는 방향으로 문제를 풀었습니다.
크로아티아 알파벳을 다룰때 몇가지 유의사항이 있습니다.
dz=와 z=는 상당히 유사합니다. (예제 2번)
크로아티아 알파벳을 제거하면 가짜 크로아티아 알파벳이 생길 수 있습니다. (예제 3번)
n j 로 표현해 크로아티아 알파벳으로 잘못 읽히는 걸 방지했습니다.import java.io.*;
import java.util.*;
class Main {
// dz=와z=를 어떻게 처리할 것인가
public static void main(String[] args) throws IOException {
String[] Croatia = { "c=", "c-", "d-", "lj", "nj", "s=", "z=" }; // dz=는 제외
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String S = br.readLine();
int cnt = 0;
// dz=만 길이가 3이고, z=보다 먼저 처리해야 하기 때문에 따로 처리합니다.
// z=보다 빨라야 하는 이유는 z=는 dz=를 d와z=로 인식해 버리기 때문입니다.
for (int i = 0; i < S.length() - 2; i++) {
if (S.substring(i, i + 3).equals("dz=")) cnt++; // 여기서 dz=를 제거하지 않고 개수만 셌다가
}
S = S.replaceAll("dz=", " "); // 여기서 한번에 문자열 제거를 진행합니다.
for (int j = 0; j < Croatia.length; j++) {
for (int i = 0; i < S.length() - 1; i++) {
if (S.substring(i, i + 2).equals(Croatia[j])) cnt++;
}
// 처음에 S.replaceAll(Croatia[j], " ")를 했는데 예제3에서 오류가 발생했습니다. lj가 없어진 후 nj를 크로아티아 문자로 인식해 버렸습니다.
S = S.replaceAll(Croatia[j], " "); // 중간이 없어지면서 생긴 문자를 크로아티아 문자로 인식하는걸 방지합니다.
}
S = S.replaceAll(" ", ""); // 임시로 띄어쓰기한 걸 다시 붙여줍니다.(띄어쓰기도 length에 포함되기 대문에 없애야 합니다)
System.out.println(cnt + S.trim().length());
}
}