관리 메뉴

LC Studio

백준 2941 크로아티아 알파벳 (Java) 본문

Java/백준 알고리즘

백준 2941 크로아티아 알파벳 (Java)

Leopard Cat 2022. 3. 18. 11:25

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

크로아티아 알파벳변경
č c=
ć c-
dz=
đ d-
lj lj
nj nj
š s=
ž z=

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

입력

첫째 줄에 최대 100글자의 단어가 주어진다. 알파벳 소문자와 '-', '='로만 이루어져 있다.

단어는 크로아티아 알파벳으로 이루어져 있다. 문제 설명의 표에 나와있는 알파벳은 변경된 형태로 입력된다.

출력

입력으로 주어진 단어가 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다.

 

위와같은 문제였다.

1. 문자열로 입력받아

2. charAt()를 활용하여 한글자씩 추출하여

3. switch문을 활용해 크로아티아 알파벳인 경우 예외처리하는 방식으로 풀어보았다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String alpha = br.readLine(); //입력
        br.close(); //입력 종료
        int count = 0; //알파벳 수
        
        for(int i=0;i<alpha.length();i++){ //입력받은 값의 길이만큼 반복
            switch (alpha.charAt(i)){ //입력받의 값의 한 단어씩 비교
                case 'c':
                        if(i != alpha.length()-1){
                            if(alpha.charAt(i+1) == '=' || alpha.charAt(i+1) == '-'){
                                count++;
                                i++;
                                break;
                            }
                            else{
                                count++;
                                break;
                            }
                        }
                        else{
                            count++;
                            break;
                        }
                    
                case 'd':
                        if(i != alpha.length()-1 && i != alpha.length()-2){
                            if(alpha.charAt(i+1) == 'z' && alpha.charAt(i+2) == '='){
                                count++;
                                i++;
                                i++;
                                break;
                            }
                            else{
                                count++;
                                break;
                            }
                        }
                        else if(i != alpha.length()-1){
                            if(alpha.charAt(i+1) == '-'){
                                count++;
                                i++;
                                break;
                            }
                            else{
                                count++;
                                break;
                            }
                        }
                        else{
                            count++;
                            break;
                        }
                case 'l': case 'n':
                        if(i != alpha.length()-1){
                            if(alpha.charAt(i+1) == 'j'){
                                count++;
                                i++;
                                break;
                            }
                            else{
                                count++;
                                break;
                            }
                        }
                        else{
                            count++;
                            break;
                        }
                case 's': case 'z':
                        if(i != alpha.length()-1){
                            if(alpha.charAt(i+1) == '='){
                                count++;
                                i++;
                                break;
                            }
                            else{
                                count++;
                                break;
                            }
                        }
                        else{
                            count++;
                            break;
                        }
                default:
                        count++;
                        break;
            }
        }
        System.out.println(count);
    }
}

굉장히 길고 복잡하고 직관적이지 못하다.

그리고 심지어 틀린 답이다ㅎㅎ. case별로 묶어서 계산했지만 뭔가 잘못된 모양이다.

도저히 모르겠어서 아예 새롭게 코딩해 보았다.

 

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Test{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String alpha = br.readLine(); //입력
        br.close(); //입력 종료
        int count = 0; //알파벳 수

        for(int i=alpha.length()-1;i>=0;i--){
            switch (alpha.charAt(i)){
                case '=': 
                if(i>0){
                    //'='앞에 's' or 'c'가 있는 경우
                    if(alpha.charAt(i-1)== 's' || alpha.charAt(i-1)== 'c'){
                        count++;
                        i--;
                        break;
                    }
                    //'='앞에 z가 있는 경우
                    else if(alpha.charAt(i-1)== 'z'){
                        //i가 2보다 크면서 '='앞에 'dz'가 있는 경우
                        if(i >= 2 && alpha.charAt(i-2)== 'd'){
                            count++;
                            i--;
                            i--;
                            break;
                        }
                        //'='앞에 'z'만 있는 경우
                        else{
                            count++;
                            i--;
                            break;
                        }
                    }
                    //'='앞에 유효한 크로아티아 문자가 없는 경우
                    else{
                        count++;
                        break;
                    }
                }
                else{
                    count++;
                    break;
                }

                case '-':
                if(i>0){
                    //'='앞에 'd' or 'c'가 있는 경우
                    if(alpha.charAt(i-1)== 'd' || alpha.charAt(i-1)== 'c'){
                        count++;
                        i--;
                        break;
                    }
                    //'='앞에 유효한 크로아티아 문자가 없는 경우
                    else{
                        count++;
                        break;
                    }
                }
                else{
                    count++;
                    break;
                }

                case 'j':
                if(i>0){
                    //'='앞에 'l' or 'n'이 있는 경우
                    if(alpha.charAt(i-1)== 'l' || alpha.charAt(i-1)== 'n'){
                        count++;
                        i--;
                        break;
                    }
                    //'='앞에 유효한 크로아티아 문자가 없는 경우
                    else{
                        count++;
                        break;
                    }
                }
                else{
                    count++;
                    break;
                }

                default:
                    count++;
                    break;
            }  
        }
        System.out.println(count);
    }
}

이번에는 주석도 상세하게 달아 이해하기 편할 것이다. 그리고 정답이다!

앞선 코딩과 달리 이번에는 역순으로 비교해 보았다.

즉, '=', '-', 'j' 와 같이 문자열 마지막에 있는 문자를 중심으로 switch문을 구성했다.

그렇게 하니 훨씬 직관적이고 짧은 코드가 나왔다. 시간이 오래 걸리기는 했지만 스스로 해결해서 뿌듯하다.

이제 다른 블로그에서는 어떻게 해결하였는지 보고 배우러 간다~!

반응형

'Java > 백준 알고리즘' 카테고리의 다른 글

백준 10250 ACM 호텔 (JAVA)  (0) 2022.03.20
백준 2869 달팽이는 올라가고 싶다 (JAVA)  (0) 2022.03.19
백준 2908번 상수 (JAVA)  (0) 2022.03.17
백준 1157 단어공부 (Java)  (0) 2022.03.17
백준 1065 한수 (JAVA)  (0) 2022.03.16