https://programmers.co.kr/learn/courses/30/lessons/60057
stack 을 이용해서 풀어봤다.
int solution(string s) {
int answer = s.size();
int min = 1000;
int pointSidx = 0;
int unit = 1;
stack<pair<string, int>> sameStringStack;
string cmp = "";
string temp = "";
while (unit <= int(s.size() * 0.5))
{
cmp = "";
temp = "";
while (pointSidx <= s.size()) {
temp = s.substr(pointSidx, unit);
pointSidx += unit;
if (!sameStringStack.empty()) {
if (sameStringStack.top().first == temp) { // 같은 부분 string 이면 개수 더해줌
sameStringStack.top().second++;
}
else { // 부분 string 이 다르면
auto pop = sameStringStack.top();
sameStringStack.pop();
if (pop.second == 1) {
cmp += pop.first;
sameStringStack.push({ temp, 1 });
}
else {
cmp += to_string(pop.second) + pop.first;
sameStringStack.push({ temp, 1 });
}
}
}
else {
sameStringStack.push({ temp, 1 });
}
}
for (int i = pointSidx - unit; i < s.size(); i++){
cmp += s[i];
}
if (cmp.size() < s.size()) {
answer = std::min(int(cmp.size()), answer);
}
unit++;
pointSidx = 0;
sameStringStack.pop();
}
return answer;
}