예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
크로아티아 알파벳 | 변경 |
---|---|
č | c= |
ć | c- |
dž | dz= |
đ | d- |
lj | lj |
nj | nj |
š | s= |
ž | z= |
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
ljes=njak
6
ddz=z=
3
nljj
3
c=c=
2
문자 한 개로 이루어지지 않은 크로아티아 알파벳 → 크파벳
크파벳을 미리 문자열 배열(cAlpha
)에 저장해놓는다.
입력받은 단어(str
)말고 크파벳 배열을 기준으로 for
문 돌려야 한다. str
을 기준으로 루프를 실행하게 되면 크파벳을 찾기가 힘들어진다.
또한, 도입부에서 StringBuffer.indexOf()
를 이용하여 크파벳의 사용 시작 위치(인덱스)를 전달받는다. 이 메소드는 사용된 알파벳이라면 문자의 시작 위치를, 사용된 알파벳이 아니라면 -1
을 리턴한다.
입력받은 단어에 동일한 크파벳이 여러번 쓰일수도 있으므로, for
문의 내부에 반복문을 하나 더 실행시켜야 한다.
인덱스 =! -1
이 아닐 때 크파벳을 1개의 임의의 문자로 변환해준다. 이는 크파벳을 문자 한개로 인식하도록 하기 위함인데, String.replace()
는 원하는 위치의 문자만을 제거할 수 없으므로 StringBuffer.replace()
를 사용해야 한다.
또한 크파벳이 사용되었으므로 문자의 갯수를 카운트 한다.
루프를 종료하고 나면 크파벳을 제외한 알파벳이 남게 된다. 반복문을 통해 단어의 모든 문자를 검사하며 str의 알파벳!=임의의 문자
인 경우 문자의 갯수를 카운트 한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
String[] cAlpha = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine(); // 단어 입력받기
StringBuffer sb = new StringBuffer(); // 버퍼 사용(원하는 위치의 문자를 변환하기 위함)
sb.append(str);
scanner.close();
int cnt = 0; // 문자의 갯수
for(int i=0; i<cAlpha.length; i++) {
int idx = sb.indexOf(cAlpha[i]); // 크파벳이 포함된 문자열 시작 위치
while(idx != -1) { // 크파벳이 존재하는 동안
cnt++; // 문자 갯수 count
int idx2 = idx + cAlpha[i].length(); // 사용된 크파벳의 끝 위치
sb.replace(idx, idx2, "0"); // 크파벳을 임의의 문자 "0"으로 변환
idx = sb.indexOf(cAlpha[i]); // 같은 크파벳이 사용된 위치가 있는지 검색
}
}
for(int i=0; i<sb.length(); i++) {
if(sb.charAt(i) != '0')
cnt++; // 문자 갯수 count
}
System.out.println(cnt);
}
}