반응형
문제 출처 :
https://www.acmicpc.net/problem/9996
알고리즘 분석 :
문제 해결에 필요한 사항
1. String STL
2. 구현
이 문제를 생각해보자.
snldfkadf*asdnlkasd라는 방식으로 항상 *은 문자 사이에 오게 된다.
따라서 우리는 어떤 문자 T를 입력받고 위의 문자와 비교하기 위해
T의 앞부분이 snldfkadf와 같은지 확인하고 T의 뒷부분이 asdnlkasd와 같은지만 확인하면 된다.
그렇게 된다면 나머지 중간의 값은 *이 해결해 줄 것이다.
따라서 앞 문자열은 substr을 통해 compare를 해주면 되고 뒷 문자열은 *다음문자부터 받아오는 하나의 substr을 reverse해주어
compare를 해주면 된다.
예를 들어 abc*dfc가 있고 abcqwnelkdfc가 있다면
*다음부터인 dfc를 뒤집으면 cfd가 되고 abcqwnelkdfc를 뒤집어주면 cfdkle...가 된다. 따라서 cfd와 cfd가 같은지만 비교해주면 된다.
소스 코드 :
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 | #include <iostream> #include <cstdio> #include <string> #include <algorithm> #define fastio() ios::sync_with_stdio(0),cin.tie(0); using namespace std; int main() { fastio(); int n; string str; cin >> n; cin >> str; string s = "", e = ""; int len = str.size(); int i = 0; for (i; str[i] != '*'; i++) s += str[i]; i++; for (i; i < len; i++) e += str[i]; reverse(e.begin(), e.end()); while(n--) { string tmp; cin >> tmp; int sLen = s.size(); int eLen = e.size(); if (tmp.substr(0, sLen).compare(s) == 0) { tmp = tmp.substr(sLen, tmp.size()); reverse(tmp.begin(), tmp.end()); if (tmp.substr(0, eLen).compare(e) == 0) { cout << "DA" << endl; continue; } } cout << "NE" << endl; } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1658번] 돼지 잡기 (2) | 2017.11.14 |
---|---|
[2866번] 문자열 잘라내기 (0) | 2017.11.13 |
[3024번] 마라톤 틱택토 (0) | 2017.11.12 |
[3023번] 마술사 이민혁 (0) | 2017.11.11 |
[2367번] 파티 (0) | 2017.11.10 |