본문 바로가기
PS 문제 풀이/Baekjoon

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

by 까망 하르방 2021. 2. 21.
반응형

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

 Input 
nljj

 Output 

3

 Input 
c=c=

 Output 

2

변경된 문자에서 크로아티아 알파벳이 몇 개 인지 출력하는 문제이다.

예를 들어, [ljes=njak]은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 

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

 

dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. 

lj와 nj도 마찬가지이다. 목록 외에 알파벳은 한 글자씩 센다.

* 주의해야하는 case는 'dz='만 주어진 목록에서 3글자이므로 배열 indxe 제어 예외 처리


import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
         
        // 문자열 입력
        String str = sc.next();
        sc.close();
         
        String[] changedCroatia = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};
        String[] firstLetter = {"c", "d", "l", "n", "s", "z"};
         
        int i=0;
        int answer = 0;
         
        // 입력받은 모든 문자열길이 만큼 탐색
        while(i < str.length()) {
            String target = str.substring(i, i+1);
            // 변경된 크로아티아 알파벳의 '가능성'이 있는지 앞글자를 이용해 우선 확인
            boolean isFirstLetter = false;
            for(int j=0; j<firstLetter.length; j++) {
                if(target.equals(firstLetter[j])) {
                    isFirstLetter = true;
                    break;
                }
            }
            // 변경된 크로아티아 문자열인지 확이한다.
            boolean isChangedCroatia = false;
            if(isFirstLetter) {
                // 먼저 dz= 조합이 가능한지  확인한다. 왜냐하면 이 조합만 길이가 3이므로
                // 배열을 벗어나지 않는 한에서 target을 포함한 길이가 3인 문자열을 들고와서 대조한다.
                if(i+3 <= str.length() && str.substring(i,i+3).equals("dz=")) {
                    answer++;
                    isChangedCroatia = true;
                    i = i + 3;
                }else { // target을 포함한 길이가 2인 문자열을 들고와 변경된 크로아티아 문자열인지 확인한다.
                    // 배열을 벗어나는지 먼저 확인
                    if(i+2 <= str.length()) {
                        for(int j=0; j<changedCroatia.length; j++) {
                            if(str.substring(i,i+2).equals(changedCroatia[j])) {
                                i = i+2;
                                answer++;
                                isChangedCroatia = true;
                                break;
                            }
                        }
                    }
                }
            }
            if(!isChangedCroatia) {
                // 문제에서 주어진 목록이 없다면
                // 변경없이 단순한 크로아티아 문자이다.
                // 다음 탐색을 이어간다.
                answer++; i++;    
            }
        }
        System.out.println(answer);
    }
}

 

반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 15651 N과 M(3)  (0) 2021.02.21
[BOJ] 백준 1002 터렛  (0) 2021.02.21
[BOJ] 백준 2960 에라토스테네스의 체  (0) 2021.02.21
[BOJ] 백준 1929 소수 구하기  (0) 2021.02.21
[BOJ] 백준 1747 소수&팰린드롬  (0) 2021.02.21

댓글