백준 2941 크로아티아 알파벳(Java) - 문자열 카운트 / 시행착오
문제
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다.
따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.
![](https://blog.kakaocdn.net/dn/bAXMpg/btrkK61d1pE/3KDpsMI2omAwp3sXrwuF81/img.png)
예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다.
단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다.
lj와 nj도 마찬가지이다.
위 목록에 없는 알파벳은 한 글자씩 센다.
입력
첫째 줄에 최대 100글자의 단어가 주어진다.
알파벳 소문자와 '-', '='로만 이루어져 있다.
단어는 크로아티아 알파벳으로 이루어져 있다.
문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.
출력
입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.
먼저 내가 처음 시도한 방법.
이 방법으로 하면 틀렸다고 뜨는데,
처음 입력받은 문자열의 글자수를 먼저 계산하고
dz= 이 발견되면 3글자 -> 1글자 취급이니까 글자수 -2
c=, c-, d-, lj, nj, s=, z= 이면 2글자->1글자 취급이니까 글자수 -1
했는데 답이 나오지 않는다...
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str= br.readLine(); //입력받을 문자열
br.close();
int length = str.length(); //문자열의 글자수
int cnt = str.length(); //출력할 글자수
for (int i = 0; i < length; i++){ //문자열의 글자수
//c=, c-
if(str.charAt(i) == 'c' && i < length - 1){ //맨 마지막 하나 앞에 있는 c
if(str.charAt(i+1) == '=' || str.charAt(i+1) == '-'){ //다음에 == , -가 오면
cnt--; //c= , c- 두 글자가 한글자로 취급되므로 -1
}
}
//dz=
if(str.charAt(i) == 'd' && i < length - 2){
if(str.charAt(i+1) == 'z' && i < length - 1){
if(str.charAt(i+2) == '='){
cnt = cnt -2; //dz= 3글자가 1글자로 취급되므로 -2
}
}
}
//d-
if(str.charAt(i) == 'd' && i < length - 1){
if(str.charAt(i+1) == '-'){
cnt--;
}
}
//lj, nj
if((str.charAt(i) == 'l' || str.charAt(i) =='n') && i < length - 1){
if(str.charAt(i+1) == 'j'){
cnt--;
}
}
//s=, z=
if((str.charAt(i) == 's' || str.charAt(i) =='z') && i < length - 1){
if(str.charAt(i+1) == '='){
cnt--;
}
}
}
System.out.println(cnt);
}
}
왜 틀렸는지 모르겠다고 쓰다가 보니 이해가 됐다.;;
카운트를 마이너스 해봤자,
그다음 합쳐지는 글자
c=, c-, dz=, d-, lj, nj, s=, n= 에서 볼드 친 글자들을 스킵하고 지나가야하는데 이걸 다 세면 안 되는 거네
저걸 다 세면 z= 과 -의 판별에서 문제가 생길 수 있어보인다.
그리고 이건 다시 시도하여 맞은 방법
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str= br.readLine(); //입력받을 문자열
br.close();
int length = str.length(); //문자열의 글자수
int cnt = 0; //출력할 글자수
for (int i = 0; i < length; i++){ //문자열의 글자수
//c=, c-
if(str.charAt(i) == 'c' && i < length - 1){ //맨 마지막 하나 앞에 있는 c
if(str.charAt(i+1) == '=' || str.charAt(i+1) == '-'){ //다음에 == , -가 오면
i++ ; //c= , c- 두 글자가 한글자로 취급 : 번지 하나 올려주기
}
}
else if(str.charAt(i) == 'd' && i < length - 1){
if(str.charAt(i+1) == '-'){//d-
i++;
} else if(str.charAt(i+1) == 'z' && i < length - 2){//dz=
if(str.charAt(i+2) == '='){
i = i+2;
}
}
}
//lj, nj
else if((str.charAt(i) == 'l' || str.charAt(i) =='n') && i < length - 1){
if(str.charAt(i+1) == 'j'){
i++;
}
}
//s=, z=
else if((str.charAt(i) == 's' || str.charAt(i) =='z') && i < length - 1){
if(str.charAt(i+1) == '='){
i++;
}
}
cnt++;
}
System.out.println(cnt);
}
}
번지를 하나 혹은 dz=같은 경우 2개 올린 다음에 판별
했더니 정답이 되었다.
크로아티아어에는 관심조차 준 적이 없는데, 아무튼 예외 처리가 생각보다 쉽지 않았던 문제.