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;
}