문제 링크 : 문자열 압축
문제 조건에서 문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다. 라는 조건을 늦게 봐서 애먹었던 문제였다.
즉, x / ababcdcd / ababcdcd 로 자르는 것은 불가능 이므로 그냥 단순하게 앞에서부터 정해진 개수만큼 잘라가며 비교하면 된다.
또 문자열을 자르는 길이가 전체 문자열의 반절을 넘어가면 자르는게 불가능하므로 전체 문자열의 반절까지 탐색해주면 된다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string makeString(string temp, int temp_cnt) {
if(temp_cnt==1) return temp;
else return to_string(temp_cnt)+temp;
}
int solution(string s) {
int answer = s.size();
int cnt=1;
while(cnt*2<=s.size()) {
string result="";
string temp = "";
int temp_cnt=1;
for(int i=0 ; i<s.size() ; i+=cnt) {
string target = s.substr(i, cnt); // 마지막에 문자열 길이가 cnt보다 적게 남으면 남은 문자열만 target에 들어간다.
if(temp == target) {
temp_cnt++;
} else {
result += makeString(temp, temp_cnt);
temp = target;
temp_cnt=1;
}
}
result += makeString(temp, temp_cnt); // 남은 문자열 처리
int result_size = result.size();
answer = min(answer, result_size);
cnt++;
}
return answer;
}