3 minute read


Input-1
ljes=njak
Output-1
6

Input-2
ddz=z=
Output-2
3

Input-3
nljj
Output-3
3


문제 풀이

주어진 단어배열의 인덱스로 접근하는 방식과 주어진 단어에서 크로아티아 알파벳을 찾아 치환하는 방식 2가지로 문제를 풀어보았다.

배열의 인덱스로 접근하는 방식

배열의 인덱스별로 크로아티아 알파벳의 첫 문자와 같다면 그 다음문자도 같은 방식으로 검증해보자.

주어진 알파벳 단어를 S라 하고 S의 길이만큼 순회해야 하니 반복문을 작성하자.
만약 c를 입력받았다면 c 다음 문자가 =인지 -인지를 알아야 한다.
인덱스(i)로 접근하여 c의 다음 문자가 =인지 -인지 알 수 있다.
현재 문자가 c, d, l, n, s, z 일 때 조건을 실행하여 다음문자를 검증하도록 하자.

그리고 c의 다음 문자가 =이나 -임을 알았다면 다음 문자인 =과 -는 검증할 필요가 없으니 인덱스를 하나 증가시켜서 그 다음 문자를 검증하도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
for (int i=0; i<str.length; i++) {
    if(str[i].equals("c")) {
        if(i < str.length-1) {
            if(str[i+1].equals("=")) {
                i += 1; // 다음 문자 =는 검증필요 X
            }
            else if(str[i+1].equals("-")) {
                i += 1; // 다음 문자 -는 검증필요 X
            }
        }
    }
}

그런데 중요한 것은 배열의 인덱스 범위를 벗어나면 안된다.
예를 들어 “dz=c”의 경우 마지막 c 다음 문자가 없기에 인덱스 범위를 벗어나게 된다.

인덱스 범위를 벗어나지 않도록 할 수 있을까?

  • 인덱스(i)가 S.length-1 값보다 작을 때 조건을 검증하도록 해야 한다.
  • dz=의 경우에는 연달아 2글자이기에 인덱스(i)가 S.length-2 보다 작을 때 조건을 검증한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
else if(str[i].equals("d")) {
    if(i < str.length-1) { // i+1의 인덱스가 =일 경우
        if(str[i+1].equals("z")) {
            if(i < str.length-2) { // i+2의 인덱스가 =일 경우
                if(str[i+2].equals("=")) {
                    i += 2;
                }
            }
        }
        else if(str[i+1].equals("-")) {
            i += 1;
        }
    }
}


문자를 치환하는 방식

입력받은 문자열 중 크로아티아 알파벳에 해당하는 문자 부분만 치환하면 단어의 개수를 알 수 있다.

먼저 크로아티아 알파벳 배열을 선언하고 초기화 하자.

1
String[] alph_list = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

위의 alph_list의 원소들이 입력받은 문자열(str)에 포함되었다면
str에서 해당 크로아티아 알파벳 문자열을 찾아 “*“로 치환하자.

예를 들어 예제-1의 “ljes=njak”를 입력받는다면
lj, s=, nj 를 찾아 ““로 치환하여 str는 “e**ak”로 변경된다.

그러면 찾아야 하는 단어를 *로 치환하여 하나의 단어로 판단할 수 있다.
치환되지 않은 e, a, k와 더불어 *가 3개니 결국 “ljes=njak”의 크로아티아 알파벳 개수를 알 수 있다.

1
2
3
4
5
6
for (int i=0; i<alph_list.length; i++) {
    if(str.contains(alph_list[i])) {
        str = str.replace(alph_list[i], "*");
    }
}
bw.write(str.length() + "\n");


작성코드

작성코드 - 배열의 인덱스로 접근하는 방식

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
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));        

        String[] str = br.readLine().split("");
        int cnt = 0;

        for (int i=0; i<str.length; i++) {
            if(str[i].equals("c")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("=")) {
                        i += 1;
                    }
                    else if(str[i+1].equals("-")) {
                        i += 1;
                    }
                }
            }
            else if(str[i].equals("d")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("z")) {
                        if(i < str.length-2) {
                            if(str[i+2].equals("=")) {
                                i += 2;
                            }
                        }
                    }
                    else if(str[i+1].equals("-")) {
                        i += 1;
                    }
                }
            }
            else if(str[i].equals("l")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("j")) {
                        i += 1;
                    }
                }
            }
            else if(str[i].equals("n")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("j")) {
                        i += 1;
                    }
                }
            }
            else if(str[i].equals("s")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("=")) {
                        i += 1;
                    }
                }
            }
            else if(str[i].equals("z")) {
                if(i < str.length-1) {
                    if(str[i+1].equals("=")) {
                        i += 1;
                    }
                }
            }
            cnt += 1;
        }
        bw.write(cnt + "\n");
        bw.flush();
        bw.close();
        br.close();
    }
}

작성코드 - 문자를 치환하는 방식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.*;

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));        

        String str = br.readLine();
        String[] alph_list = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

        for (int i=0; i<alph_list.length; i++) {
            if(str.contains(alph_list[i])) {
                str = str.replace(alph_list[i], "*");
            }
        }
        bw.write(str.length() + "\n");
        bw.flush();
        bw.close();
        br.close();
    }
}

회고

  • 배열의 인덱스로 접근하는 방식과 문자열을 치환하는 방식으로 문제의 비즈니스 로직 패턴을 다르게 생각하여 접근할 수 있었다.
  • 두가지 방식 모두 메모리와 실행속도는 큰 차이가 없었으나, 코드길이가 대폭 줄었다는 것만으로 뿌듯했다..