Algorithm

[백준] 2941번 - 크로아티아 알파벳 (Java)

haehyun 2022. 2. 7. 17:58

문제

https://www.acmicpc.net/problem/2941

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

코드

import java.util.Scanner;

// 크로아티아 알파벳
public class Ex_2941 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        StringBuffer sb = new StringBuffer();
        int count = 0;

        // 시작하는 문자에 따라 체크 (c, d, l, n, s, z)
        for (int i = 0; i < str.length(); i++) {
            char first = str.charAt(i);                                     // 시작 문자
            char second = i + 1 < str.length() ? str.charAt(i + 1) : 'a';   // 다음 문자
            char third = i + 2 < str.length() ? str.charAt(i + 2) : 'a';    // 다다음 문자
            count++;

            switch (first) {
                case 'c':               // c=, c-
                    if (second == '=' || second == '-')
                        i++;            // i ~ i+1 까지 한 문자이므로 다음 문자 1개 패스
                    break;
                case 'd':               // d-, dz=
                    if (second == '-')
                        i++;
                    else if (second == 'z' && third == '=')
                        i += 2;         // i ~ i+2 까지 한 문자이므로 다음 문자 2개 패스
                    break;
                case 'l': case 'n':     // lj, nj
                    if (second == 'j')
                        i++;
                    break;
                case 's': case 'z':     // s=, z= 
                    if(second == '=')
                        i++;
                    break;
            }
        }

        System.out.println(count);
    }
}

 

  • charAt(int index) 메서드로 문자를 하나씩 가져온다.
  • 읽어들인 문자를 시작 문자(first)라고 했을 때, 다음 문자(second) 다다음 문자(third)를 가져온다. (크로아티아 알파벳은 2~3글자)
    • 문자열 s가 "dz=" 일 경우
      first = 'd'
      second = 'z'
      third = '='
      ~와 같이 초기화된다.
  • 단, 마지막 글자(i가 str.length() -1) or 마지막에서 두번째 글자(i가 str.length() -2)일 경우에는 charAt(i+1), charAt(i+2)로 다음 글자들에 접근하려 할 경우 StringIndexOutOfBoundsException 예외가 발생한다. (=접근하려는 인텍스가 배열 크기를 넘어감) 이를 방지하기 위해서 위의 경우에는 크로아티아 알파벳과 전혀 상관없는 아무 문자('a')로 값을 초기화해준다.
  • 크로아티아 알파벳은 무조건 c, d, l, n, s, z 6개 알파벳 중 하나로 시작한다. switch문으로 시작 문자를 체크해 각각 다르게 동작하도록 작성한다.
  • first+second 문자 조합이 크로아티아 알파벳과 일치할 경우, first+second 는 하나의 문자로 취급하므로 for문에서 second 문자 차례는 그냥 넘기도록 한다. (이미 문제 세트를 이뤘으므로)
  •  first+second+third 문자 조합이 크로아티아 알파벳과 일치할 경우 second, third 문자 차례를 연달아 2번 그냥 넘기도록 한다.