본문 바로가기

백준

2941)크로아티아 알파벳

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


크로아티아 알파벳이 두 개 또는 세 개의 알파벳으로 표현된다.


입력으로 주어지는 문자열은 크로아티아 알파벳과 알파벳이 섞여있을 수 있다.


크로아티아 알파벳과 알파벳 수를 세어 그 수를 출력해야 한다.


문자열 비교 알고리즘에서 점프 테이블의 용도가 다 비교하지 않고 건너뛰는 데서 약간의 아이디어를 얻었다.


예를 들어 문자열을 차례로 접근하다 'c'를 만나고 그 다음 문자가 '='이거나 '-'이면 1칸 건너 뛴다.


크로아티아 알파벳을 먼저 검사한 뒤 '='이거나 '-'인 경우를 제외한 알파벳을 세면 된다.


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
#include<stdio.h>
 
int main() {
    char tempStr[101];
    int count = 0;
 
    gets(tempStr);
 
    for (int i = 0; tempStr[i] != NULL; i++) {
        if (tempStr[i] == 'c' && (tempStr[i + 1== '-' || tempStr[i + 1== '=')) {
            count++;
            i++;
        }
        else if (tempStr[i] == 'l'&&tempStr[i + 1== 'j') {
            count++;
            i++;
        }
        else if (tempStr[i] == 'n'&&tempStr[i + 1== 'j') {
            count++;
            i++;
        }
        else if (tempStr[i] == 's'&&tempStr[i + 1== '=') {
            count++;
            i++;
        }
        else if (tempStr[i] == 'z'&&tempStr[i + 1== '=') {
            count++;
            i++;
        }
        else if (tempStr[i] == 'd' && tempStr[i + 1== 'z' &&tempStr[i + 2== '=') {
            count++;
            i += 2;
        }
        else if (tempStr[i] == 'd'&&tempStr[i + 1== '-') {
            count++;
            i++;
        }
        else if (tempStr[i] != '='&&tempStr[i] != '-') {
            count++;
        }
    }
    printf("%d\n", count);
 
    return 0;
}
cs


검사 구문이 길어 코드가 지저분하다.

크로아티아 알파벳의 첫 글자로 인덱싱하는 테이블을 만들면 조금 더 깔끔하게 코드를 작성할 수 있을 것도 같다.

처음에 이 생각을 했는데 'd'로 시작하는 크로아티아 알파벳은 길이가 3이거나 2이다.

구조체 테이블을 만들면 길이가 3인 "dz=" 때문에 한 열을 더 할당해야 한다.

공간 낭비가 크고 귀찮아서 안했다.




'백준' 카테고리의 다른 글

1476)날짜 계산  (0) 2019.01.08
10799)쇠막대기  (0) 2019.01.07
2902)KMP는 왜 KMP일까?  (0) 2019.01.06
11365)!밀비 급일  (0) 2019.01.06
11721)열 개 씩 끊어 출력하기  (0) 2019.01.05