본문 바로가기
Algorithm/Beakjoon

[Java] baekjoon 2941 : 크로아티아 알파벳 / 문자열

by Amy97 2021. 8. 30.
728x90

문제 


 

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

 

2941번: 크로아티아 알파벳

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

www.acmicpc.net

해결 


1. 여러 개의 문자로 이루어진 크로아티아 알파벳 8개(c=, c-, dz=, d-, lj, nj, s=, z=)를 하나로 인식해야 한다

2. StringIndexOutOfBoundsException 주의

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
import java.util.*;
 
public class Main {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
 
        String str = sc.next();
        int cnt = 0;
 
        for (int i = 0; i < str.length(); i++) {
 
            char ch = str.charAt(i);
 
            if (ch == 'c') {
                if (str.charAt(i + 1== '=' || str.charAt(i + 1== '-') {
                    i++;
                }
            } else if (ch == 'd') {
                if (str.charAt(i + 1== '-') {
                    i++;
                } else if (str.charAt(i + 1== 'z') {
                    if (str.charAt(i + 2== '=') {
                        i += 2;
                    }
                }
            } else if (ch == 'l') {
                if (str.charAt(i + 1== 'j') {
                    i++;
                }
            } else if (ch == 'n') {
                if (str.charAt(i + 1== 'j') {
                    i++;
                }
            } else if (ch == 's') {
                if (str.charAt(i + 1== '=') {
                    i++;
                }
            } else if (ch == 'z') {
                if (str.charAt(i + 1== '=') {
                    i++;
                }
            }
            
            cnt++;
        }
        System.out.println(cnt);
 
    }
}
cs

c, d, l, n, s, z가 마지막 문자인 경우에는 charAt(i + 1)가 존재하기 않기 때문에 StringIndexOutOfBoundsException 에러가 발생한다.

 

i의 값이 입력받은 문자열의 길이 -1 보다 작을 경우에만 다음 조건문을 실행시키면 해결된다.

다만, dz=를 검사할 때는 i가 문자열의 길이 - 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
import java.util.*;
public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        String str = sc.next(); // 문자열 입력받음
        int cnt = 0// 크로아티아 알파벳의 개수를 세는 변수를 선언하고 0으로 초기화
        for (int i = 0; i < str.length(); i++) { // 입력받은 문자열의 길이만큼 for문 실행
            char ch = str.charAt(i); 
            if (ch == 'c' && i < str.length() - 1) { // 만약 i번째 문자가 c라면
                if (str.charAt(i + 1== '=' || str.charAt(i + 1== '-') { // 만약 c 다음의 문자가 = 또는 -라면
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                }
            } else if (ch == 'd' && i < str.length() - 1) {
                if (str.charAt(i + 1== '-') { // d-일 경우
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                } else if (str.charAt(i + 1== 'z' && i < str.length() - 2) {
                    if (str.charAt(i + 2== '=') { // dz= 일 경우
                        i += 2// i + 2까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 2 증가시킴
                    }
                }
            } else if (ch == 'l' && i < str.length() - 1) {
                if (str.charAt(i + 1== 'j') { // lj일 경우
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                }
            } else if (ch == 'n' && i < str.length() - 1) {
                if (str.charAt(i + 1== 'j') { // nj일 경우
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                }
            } else if (ch == 's' && i < str.length() - 1) {
                if (str.charAt(i + 1== '=') { // s=일 경우
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                }
            } else if (ch == 'z' && i < str.length() - 1) {
                if (str.charAt(i + 1== '=') { // z=일 경우
                    i++// i + 1까지가 하나의 문자이므로 다음 문자를 건너 뛰기 위해 i의 값을 1 증가시킴
                }
            }
            cnt++// 위의 조건식을 통과한 후에 증가하므로 크로아티아 알파벳의 개수만큼 증가한다
        }
        System.out.println(cnt);
    }
}
cs

결과 


728x90

댓글