[JAVA] 백준 2941. 크로아티아 알파벳

이 글은 읽는데 약 5분이 걸립니다.

※개인 공부 목적의 정리글입니다.
이 글의 내용이 최선의 해답은 아닐 수 있습니다.

문제

403 Forbidden

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

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

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

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

입력

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

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

출력

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

요약

조건문을 이용해서 입력받은 문자열을 확인하되, 뒤에 오는 문자열까지 파악해서 이것이 미리 약속된 “하나로 볼 문자”인지를 판단하여 카운트를 올린다

나의 코드

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[] input = br.readLine().split("");
        int cnt = 0;
        
        for(int i=0; i<input.length; i++){
            String s = input[i];
            String next = (i+1 == input.length) ? null : input[i+1];
            cnt++;
            
            if(next != null){
                if(s.equals("c")){
                    if(next.equals("=") || next.equals("-")){
                        i+=1;
                    }
                }else if(s.equals("d")){
                    if(next.equals("z")){
                        String next2 = (i+2 == input.length) ? "" : input[i+2];
                        if(next2.equals("=")){
                            i+=2;
                        }
                    }else if(next.equals("-")){
                        i+=1;
                    }
                }else if(s.equals("l") || s.equals("n")){
                    if(next.equals("j")){
                        i+=1;
                    }
                }else if(s.equals("s") || s.equals("z")){
                    if(next.equals("=")){
                        i+=1;
                    }
                }
            }
        }
        
        System.out.println(cnt);
        br.close();
    }
}

먼저 입력된 문자열을 split(“”)을 이용하여 한 글자 마다 분리하여 배열로 만들었다.
이제 이 배열을 처음부터 탐색하면서 확인할 것이다.

반복문의 첫 번째에서는 현재 문자열과 다음 문자열을 가져와 저장한다.
이 때 주의할 점으로, 다음 문자열을 가져올 때 그냥 i+1을 해버리면 만약 현재 문자가 마지막인 경우 다음 문자가 없으므로 오류가 발생하게 된다.
그래서 나는 삼항 연산자를 이용해 다음 인덱스가 문자열의 길이와 같은 지를 확인하는 방식으로 다음 문자열이 있는지 확인 후, 있으면 그것을, 없으면 null을 저장하도록 하였다.

그리고 카운트를 1올린다.
이후 다음 문자열들을 함께 검사해서 여러 문자를 하나로 치는 경우에는 i값을 조정하여 해당 문자를 건너뛰는 방식으로 할 것이다.

만약 다음 문자열이 있으면 비교를 한다. 다음 문자열이 없어 next가 null인 경우는 마지막 문자인 경우이며, 이미 cnt는 1올렸고, 더이상 뒤에 오는 문자가 없으니 굳이 더 확인할 필요가 없다.

일반적으로 한 글자를 한 개의 알파벳으로 보면 굳이 i값을 조정할 필요가 없다.
루프를 다 돌고나서도 i값이 1증가하기 때문이다.

그게 아니라 현재 문자와 다음 문자가 하나로 인식 해야 하면 i값을 직접 증가 시켜서 다음 문자에 대한 확인을 건너뛰게 할 수 있다.

“dz=”을 검사할 때는 다다음 문자도 알아야 하므로 위와 같은 방식으로 다다음 문자가 존재하는지 확인하고 검사하였다.

댓글