티스토리 뷰
문제 출처 : https://www.acmicpc.net/problem/1013
분류 : 오토마타, 정규표현식
백준 1013 Contact
정규표현식 (100+1+|01)+ 을 만족하는 문자열을 찾아라
처음에 풀때는 아무 생각없이 state transition graph를 그려서 그래프를 그대로 코드로 옮기려고 하였다.
그 결과 나오게 된 코드는 아래와 같다.
종결상태와 여러 입력에 대해 state를 바꾸는 오토마타를 만든 것과 다름이 없다.
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 74 75 76 77 78 79 80 81 82 83 84 85 86 | bool parse(const string& str) { char state = 'S'; int len = str.length(); for (int i = 0; i < len; i++) { char ch = str[i]; switch (state) { case 'S': if (ch == '0') { state = 'A'; } else if (ch == '1') { state = 'B'; } else return false; break; case 'A': if (ch == '1') { state = 'S'; } else return false; break; case 'B': if (ch == '0') { state = 'C'; } else return false; break; case 'C': if (ch == '0') { state = 'D'; } else return false; break; case 'D': if (ch == '0') { state = 'D'; } else if (ch == '1') { state = 'E'; } else return false; break; case 'E': if (ch == '0') { state = 'A'; } else if (ch == '1') { state = 'F'; } else return false; break; case 'F': if (ch == '0') { if (i + 1 < len) { if (str[i + 1] == '1') { state = 'A'; } else if (str[i + 1] == '0') { state = 'C'; } else return false; } else { return false; } } else if (ch == '1') { state = 'F'; } else return false; break; } } return (state == 'S' || state == 'E' || state == 'F'); } int main() { int N; cin >> N; while (N--) { string str; cin >> str; if (parse(str)) { cout << "YES\n"; } else cout << "NO\n"; } } | cs |
그런데 사실 직관적이긴 하나 그리 좋은 풀이는 아닌 것 같다.
물론 속도적인 측면에서 빠를 수도 있겠으나...
오토마타를 그리는것도, 그것을 코드에 옮기는 것도 실수가 발생 할 확률이 높다고 생각된다.
C++에서도 아마(제발..) 정규표현식을 다룰 수 있는 라이브러리가 있을 것 같다는 생각이 들었다.
다행히 C++11부터 다룰 수 있는 라이브러리가 있다.
(http://www.cplusplus.com/reference/regex/)
위 라이브러리를 이용하면 아래와 같은 코드로 풀이가 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include<iostream> #include<regex> #include<string> using namespace std; int main() { int N; cin >> N; while (N--) { string str; cin >> str; cout << (regex_match(str, regex("(100+1+|01)+"))?"YES\n":"NO\n"); } } | cs |
'Problem & Solving > Beakjoon judge' 카테고리의 다른 글
[1068] 트리 (0) | 2018.02.18 |
---|---|
[2491] 수열 (0) | 2018.02.17 |
[11403] 경로찾기 (0) | 2018.02.14 |
[1016] 제곱ㄴㄴ수 (0) | 2018.02.13 |
[11047] 동전0 (0) | 2018.01.25 |
댓글