Skip to content

Commit a5ff9ca

Browse files
committed
Lv3_브라이언의고민
1 parent f1abace commit a5ff9ca

File tree

4 files changed

+218
-1
lines changed

4 files changed

+218
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,4 +258,5 @@ paket-files/
258258

259259
# Python Tools for Visual Studio (PTVS)
260260
__pycache__/
261-
*.pyc
261+
*.pyc
262+
/Programmers/Lv3/Lv3_4단고음.cpp
Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
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+
//}

Programmers/Programmers.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,15 @@
9494
<ClCompile Include="Lv2\Lv2_피보나치수.cpp" />
9595
<ClCompile Include="Lv2\Lv2_행렬의곱셈.cpp" />
9696
<ClCompile Include="Lv3\Lv3_2xn타일링.cpp" />
97+
<ClCompile Include="Lv3\Lv3_4단고음.cpp" />
9798
<ClCompile Include="Lv3\Lv3_가장먼노드.cpp" />
9899
<ClCompile Include="Lv3\Lv3_네트워크.cpp" />
99100
<ClCompile Include="Lv3\Lv3_단속카메라.cpp" />
100101
<ClCompile Include="Lv3\Lv3_단어변환.cpp" />
101102
<ClCompile Include="Lv3\Lv3_등굣길.cpp" />
102103
<ClCompile Include="Lv3\Lv3_디스크컨트롤러.cpp" />
103104
<ClCompile Include="Lv3\Lv3_베스트앨범.cpp" />
105+
<ClCompile Include="Lv3\Lv3_브라이언의고민.cpp" />
104106
<ClCompile Include="Lv3\Lv3_섬연결하기.cpp" />
105107
<ClCompile Include="Lv3\Lv3_순위.cpp" />
106108
<ClCompile Include="Lv3\Lv3_여행경로.cpp" />

Programmers/Programmers.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,5 +303,11 @@
303303
<ClCompile Include="Lv3\Lv3_카카오프렌즈컬러링북.cpp">
304304
<Filter>소스 파일</Filter>
305305
</ClCompile>
306+
<ClCompile Include="Lv3\Lv3_브라이언의고민.cpp">
307+
<Filter>소스 파일</Filter>
308+
</ClCompile>
309+
<ClCompile Include="Lv3\Lv3_4단고음.cpp">
310+
<Filter>소스 파일</Filter>
311+
</ClCompile>
306312
</ItemGroup>
307313
</Project>

0 commit comments

Comments
 (0)