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 |