|
| 1 | +#include <string> |
| 2 | +#include <iostream> |
| 3 | +#include <set> |
| 4 | +#include <queue> |
| 5 | +#include <list> |
| 6 | +#include <vector> |
| 7 | +using namespace std; |
| 8 | + |
| 9 | +string solution94(string sentence) { |
| 10 | + string answer = ""; |
| 11 | + list<char> ans; |
| 12 | + int two = 0; |
| 13 | + set<char> s; |
| 14 | + set<char> duplicate; |
| 15 | + queue<pair<int, char>> q; |
| 16 | + list<pair<int, int>> l; |
| 17 | + |
| 18 | + l.push_back(make_pair(-1, -1)); // (start,end) 지점 저장 |
| 19 | + |
| 20 | + for (int i = 0; i < sentence.length(); i++) { |
| 21 | + char c = sentence[i]; |
| 22 | + if (c == ' ') // 공백이 있으면 규칙위반! |
| 23 | + return "invalid"; |
| 24 | + if (c >= 'a' && c <= 'z') { // 모든 소문자의 시작위치를 큐에 저장 |
| 25 | + if (s.find(c) == s.end()) { |
| 26 | + q.push(make_pair(i, c)); |
| 27 | + s.insert(c); |
| 28 | + } |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + while (!q.empty()) { |
| 33 | + char c = q.front().second; |
| 34 | + int start = q.front().first; |
| 35 | + q.pop(); |
| 36 | + int end = start; |
| 37 | + int count = 0; |
| 38 | + |
| 39 | + if (duplicate.find(c) == duplicate.end()) // 사용하지 않은 기호 |
| 40 | + duplicate.insert(c); |
| 41 | + else // 사용한 기호 |
| 42 | + return "invalid"; |
| 43 | + |
| 44 | + vector<int> pos; |
| 45 | + for (int i = start; i < sentence.length(); i++) { // 규칙의 시작과 끝점 계산 |
| 46 | + if (sentence[i] == c) { |
| 47 | + if (pos.size() > 0) { |
| 48 | + if (i-pos.back() == 1) // 이전 위치랑 붙어있다면 |
| 49 | + return "invalid"; |
| 50 | + } |
| 51 | + pos.push_back(i); |
| 52 | + end = i; |
| 53 | + } |
| 54 | + } |
| 55 | + |
| 56 | + if (l.size() > 1) { // 이전 기호가 붙어있으면 규칙위반! |
| 57 | + if (abs(start - l.back().first) == 1 || abs(l.back().second - end) == 1) //시작에 기호가 두개붙어있거나, 끝에 기호가 두개 붙어있거나 |
| 58 | + return "invalid"; |
| 59 | + } |
| 60 | + |
| 61 | + if (pos.size() == 2 && two < 1) { // 규칙2 |
| 62 | + l.push_back(make_pair(start, end)); // 규칙2 (start,end) 저장 : 기호기준 |
| 63 | + for (int j = start + 1; j < end; j++) { |
| 64 | + if (sentence[j] >= 'a' && sentence[j]<='z') { // 새로운 소문자 등장 -> 규칙1 추가 |
| 65 | + two = 2; |
| 66 | + break; |
| 67 | + } |
| 68 | + ans.push_back(sentence[j]); |
| 69 | + count++; |
| 70 | + } |
| 71 | + if (two < 1) // 규칙2만 있다면 |
| 72 | + ans.push_back(' '); |
| 73 | + else { // 규칙1이 같이 있다면 |
| 74 | + for (int j = 0; j < count; j++) |
| 75 | + ans.pop_back(); |
| 76 | + } |
| 77 | + } |
| 78 | + else { // 규칙1 |
| 79 | + if (two > 0) { |
| 80 | + if (sentence[pos.back() + 2] != sentence[l.back().second]) // dAeA"A"d -> A가 d여야함 |
| 81 | + return "invalid"; |
| 82 | + if (sentence[pos.front() - 2] != sentence[l.back().first]) // d"A"AeAd -> A가 d여야함 |
| 83 | + return "invalid"; |
| 84 | + } |
| 85 | + |
| 86 | + if (start - 1 <= l.back().second && two<1) // 시작점이 이전 범위와 겹치면 규칙위반! |
| 87 | + return "invalid"; |
| 88 | + else { |
| 89 | + if (pos.size() == 1) { // aAA, AAa |
| 90 | + if (pos.front() == 0 || pos.front()==sentence.length()-1) |
| 91 | + return "invalid"; |
| 92 | + |
| 93 | + }else { |
| 94 | + for (int j = 0; j < pos.size() - 1; j++) { // 2차이씩 안나면 규칙 위반! |
| 95 | + if (pos[j + 1] - pos[j] != 2) |
| 96 | + return "invalid"; |
| 97 | + } |
| 98 | + if (pos.front() == 0 || pos.back() == sentence.length() - 1) |
| 99 | + return "invalid"; |
| 100 | + } |
| 101 | + |
| 102 | + start = start - 1; |
| 103 | + end = end + 1; |
| 104 | + |
| 105 | + if (two < 1) |
| 106 | + l.push_back(make_pair(start, end)); // 규칙1 (start,end) 저장 : 원문기준 |
| 107 | + for (int j = start; j <= end; j += 2) { |
| 108 | + if(sentence[j] >= 'a' && sentence[j] <= 'z') // 대문자가 아니면 |
| 109 | + return "invalid"; |
| 110 | + else { |
| 111 | + ans.push_back(sentence[j]); |
| 112 | + count++; |
| 113 | + } |
| 114 | + } |
| 115 | + ans.push_back(' '); |
| 116 | + } |
| 117 | + } |
| 118 | + list<pair<int, int>>::iterator iter1 = l.end(); |
| 119 | + list<char>::iterator iter2 = ans.end(); |
| 120 | + iter1--; // 마지막 노드 |
| 121 | + iter1--; // 마지막 바로 전 노드 |
| 122 | + int prevEnd = (*iter1).second + 1; |
| 123 | + |
| 124 | + if (prevEnd < start && two!=1) { // 이전에 규칙없던 단어들 추가, |
| 125 | + if (two < 1) { // 단품 규칙은 ans안에 글자가 있어서 앞으로 가야함 |
| 126 | + for (int i = 0; i <= count; i++) |
| 127 | + iter2--; |
| 128 | + } |
| 129 | + for (int i = prevEnd; i < start; i++) |
| 130 | + ans.insert(iter2, (sentence[i])); |
| 131 | + ans.insert(iter2, ' '); |
| 132 | + } |
| 133 | + |
| 134 | + if (two > 0) // 규칙 1,2가 같이 있을때 |
| 135 | + two--; |
| 136 | + } |
| 137 | + |
| 138 | + int prevEnd = l.back().second + 1; |
| 139 | + if (prevEnd < sentence.length()) { |
| 140 | + for (int i = prevEnd; i < sentence.length(); i++) |
| 141 | + ans.push_back(sentence[i]); |
| 142 | + }else |
| 143 | + ans.pop_back(); |
| 144 | + |
| 145 | + for (char c : ans) |
| 146 | + answer += c; |
| 147 | + return answer; |
| 148 | +} |
| 149 | + |
| 150 | +//int main() { |
| 151 | +// cout << solution94("AsCsWsQsQsEEEEEEEEeEeEe") << '\n'; // invalid |
| 152 | +// cout << solution94("ABCaDaEFGbH") << '\n'; // ABC D EF GH |
| 153 | +// cout << solution94("aAaBBBcAeAeAc") << '\n'; // A BBB AAA |
| 154 | +// cout << solution94("ABCbDaEaFbHI") << '\n'; // ABC DEF HI |
| 155 | +// cout << solution94("AacacaA") << '\n'; // invalid |
| 156 | +// cout << solution94("AaBcBcBcBcB") << '\n'; // invalid |
| 157 | +// cout << solution94("aAAA") << '\n'; // invalid |
| 158 | +// cout << solution94("aA") << '\n'; // invalid |
| 159 | +// cout << solution94("AAAa") << '\n'; // invalid |
| 160 | +// cout << solution94("Aa") << '\n'; // invalid |
| 161 | +// cout << solution94("aAbBBbAa") << '\n'; // invalid |
| 162 | +// cout << solution94("aAbBBbAa") << '\n'; // invalid |
| 163 | +// cout << solution94("aAAbBbAAa") << '\n'; // invalid |
| 164 | +// cout << solution94("aAcAbAbAcAcAcAa") << '\n'; // invalid |
| 165 | +// cout << solution94("acAcAcAa") << '\n'; // invalid |
| 166 | +// cout << solution94("aAcAcAca") << '\n'; // invalid |
| 167 | +// cout << solution94("AdAeAeAdA") << '\n'; // A AAA A |
| 168 | +// cout << solution94("dAAeAd") << '\n'; // invalid |
| 169 | +// cout << solution94("dAeAAd") << '\n'; // invalid |
| 170 | +// cout << solution94("cAbBbAc") << '\n'; // ABA |
| 171 | +// cout << solution94("AbbA") << '\n'; // invalid |
| 172 | +// cout << solution94("aAaaBa") << '\n'; // invalid |
| 173 | +// cout << solution94("aAacBc") << '\n'; // A B 2 + 2 |
| 174 | +// cout << solution94("AB") << '\n'; // AB 0 + 0 |
| 175 | +// cout << solution94("AcBc") << '\n'; // A B 0 + 2 |
| 176 | +// cout << solution94("aAaB") << '\n'; // A B 2 + 0 |
| 177 | +// cout << solution94("aAbAbAbAacBdBdBdBc") << '\n'; // AAAA BBBB 1,2 + 1,2 |
| 178 | +// cout << solution94("AbAbAbABdBdBdB") << '\n'; // AAAA BBBB 1 + 1 |
| 179 | +// cout << solution94("AbAbAbAcBBBBc") << '\n'; // AAAA BBBB 1 + 2 |
| 180 | +// cout << solution94("aAbAbAbAaBdBdBdB") << '\n'; // AAAA BBBB 1,2 + 1 |
| 181 | +// cout << solution94("aAbAbAbAacBBBBc") << '\n'; // AAAA BBBB 1,2 + 2 |
| 182 | +// cout << solution94("aAAAAaBdBdBdB") << '\n'; // AAAA BBBB 2 + 1 |
| 183 | +// cout << solution94("aAAAAacBBBBc") << '\n'; // AAAA BBBB 2 + 2 |
| 184 | +// cout << solution94("aAAAAacBdBdBdBc") << '\n'; // AAAA BBBB 2 + 1,2 |
| 185 | +// cout << solution94("AbAbAbAcBdBdBdBc") << '\n'; // AAAA BBBB 1 + 1,2 |
| 186 | +// cout << solution94("IaMMbMb") << '\n'; // IM M M |
| 187 | +// cout << solution94("HaEaLaLObWORLDb") << '\n'; // HELL O WORLD |
| 188 | +// cout << solution94("AaAaAabBBb") << '\n'; // invalid |
| 189 | +// cout << solution94("AaAaAcA") << '\n'; // A A AA |
| 190 | +// cout << solution94("aAabBb") << '\n'; // A B |
| 191 | +// cout << solution94("bBbcHdEdEc") << '\n'; // B HEE |
| 192 | +// cout << solution94("HaEaLaLaObWORLDb") << '\n'; // HELLO WORLD |
| 193 | +// cout << solution94("AaAA") << '\n'; // AA A |
| 194 | +// cout << solution94("JaOOOaA") << '\n'; // J OOO A |
| 195 | +// cout << solution94("aJaOOOcAc") << '\n'; // J OOO A |
| 196 | +// cout << solution94("IaAMa") << '\n'; // I AM |
| 197 | +// cout << solution94("aIaAM") << '\n'; // I AM |
| 198 | +// cout << solution94("SpIpGpOpNpGJqOOOqA") << '\n'; // SIGONG J OOO A |
| 199 | +// cout << solution94("AxAxAxAoBoBoB") << '\n'; // invalid |
| 200 | +// cout << solution94("AxAxAxABoBoB") << '\n'; // AAAA B B B |
| 201 | +// cout << solution94("aBa") << '\n'; // B |
| 202 | +// cout << solution94("baHELLOabWORLD") << '\n'; // invalid |
| 203 | +// cout << solution94("aAbAba") << '\n'; // invalid |
| 204 | +// cout << solution94("aHbEbLbLbOacWdOdRdLdDc") << '\n'; // HELLO WORLD |
| 205 | +// cout << solution94("bAaOb") << '\n'; // AO |
| 206 | +// cout << solution94("AAAaBaBBBbB") << '\n'; // AAA B BB BB |
| 207 | +// return 0; |
| 208 | +//} |
0 commit comments