[알고리즘/자바] 백준 2941번 - 크로아티아 알파벳

2021. 7. 26. 08:10개발/알고리즘

 

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

 

 

입력된 문자의 갯수를 세는 프로그램을 만드는 문제다. 입력된 문자중에는 크로아티아 알파벳이라고 해서 2개이상의 문자가 조합되어 1개의 문자를 의미하는 케이스가 존재한다. 

 

아이디어


입력받은 문자에서 크로아티아 알파벳의 갯수를 센다. 또한 크로아티아 알파벳이 있다면 "_" 문자 형태로 치환한다.

치환된 문자에서 "_"가 아닌 문자의 갯수를 센다. 

 

 

구현


구현 하면서 주의할 점은 크로아티아 알파벳이 있는지 검사할때 긴문자부터 수행해야한다.

예를들어 크로아티아 알파벳중 "dz="와 " z="가 있는데 "z="부터 검사하면 "dz="이 입력되었을때 "d"와 "z="으로 처리하기때문에 2개의 문자로 인식한다. 

 

아래는 구현 코드.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
 
public class Main {
    
    // 알파벳 갯수를 세어서 반환한다.
    public static int countAlphabet(String word, String alphabet) {
        int result = 0;
        int startIndex = 0;
        while(true) {
 
            if( word.indexOf(alphabet,startIndex) > -1) {
                startIndex = word.indexOf(alphabet,startIndex) + 1;
                result ++;
            } else {
                break;
            }
        }
 
        return result;
    }
    
    // word의 alphabet을 "_"로 변환한다.
    public static String replaceToUnderBar(String word , String alphabet) {
        
        return word.replaceAll(alphabet, "_");
    }
    
    
    
    
    public static void main(String[] args) throws  IOException{
        // 입력
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
        
        String word = bf.readLine(); //String
        
        
        String [] croAlphabet = new String[]{"dz=" , "z=","s=","c=","c-","d-","lj","nj"};
        int result = 0;
        
        
        for(int i=0; i<croAlphabet.length; i++) {
            // croAlphabet[i]가 몇개 있는지 센다.
            result += countAlphabet(word,croAlphabet[i]);
            // croAlphabet[i]를 "_"로 변환한다.
            word = replaceToUnderBar(word,croAlphabet[i]);
            
        }
        
        // "_"가 아닌 문자가 몇개인지 센다.
        for(int i=0; i<word.length(); i++) {
            if(word.charAt(i) != '_') {
                result ++;
            }
        }
        
        
        // 결과출력
        bw.write(result + "\n");
        
        bw.flush();//남아있는 데이터를 모두 출력시킴
        bw.close();//스트림을 닫음
        
        
    }
    
}
cs