https://programmers.co.kr/learn/courses/30/lessons/60057
이문제 태스트 케이스 30/29인데 나머지 하나 뭐가 문제인지 모르겠다.
답지위주로 똑같게 맞춰봐도 모르겠다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string s) {
int answer = s.size();
string sTemp = s.substr(8, 100);
for (int i = 1; i <= (s.size() / 2); i++)
{
string sResult = "";
string sTemp = s.substr(0, i);//멘처음 만큼 자른다.
int iCnt(1);
for (int j = i; j <= s.size(); j += i)//i만큼씩 더한다.
{
if (sTemp == s.substr(j, i)) iCnt++;
else
{
if (iCnt == 1) sResult += sTemp;
else
{
sResult = sResult + to_string(iCnt) + sTemp;
iCnt = 1;
}
sTemp = s.substr(j, i);
}
}
if (s.size() % i != 0)
{
int iStart = (s.size() / i)*i;
sResult += s.substr(iStart);
}
answer = min((int)sResult.size(), answer);
}
return answer;
}
int main()
{
string s = "ababcdcdababcdcd";
string sasda = s.substr(5);
//string sTemp = s.substr(100, 2);
int iTeml = solution(s);
}
답지소스
#include <string>
#include <vector>
using namespace std;
int solution(string s) {
int len = s.size();
int answer = len;
int n = len / 2;
//i개 단위로 잘라서 압축
for (int i = 1; i <= n; i++) {
//i개 단위로 잘라서 압축한뒤 만들어지는 문자열
string result = "";
//자를 문자열 단위
string ss = s.substr(0, i);
int cnt = 1;
//앞에서 자른 문자열 단위를 제외한 뒷부분(j번 문자부터) 문자열을 검사한다.
for (int j = i; j <= len; j += i) {
//j번 부터 i개 만큼이 문자열 단위와 똑같은 경우 cnt 증가
if (ss == s.substr(j, i)) {
cnt += 1;
}
else {
//다른 경우 중 cnt가 1이면 result에 그대로 ss를 붙인다.
if (cnt == 1) {
result += ss;
}
else {
//cnt가 1보다 크다면 cnt를 문자열 단위 앞에 붙여서 result에 이어준다.
result += (to_string(cnt) + ss);
}
//문자열 단위를 j번부터 i개로 변경
ss = s.substr(j, i);
//cnt값 다시 1로 초기화
cnt = 1;
}
}
//문자열이 i로 나누어 떨어지지 않는다면 result에 나머지 부분을 붙여줘야한다.
if ((len%i) != 0) {
result += s.substr((len / i)*i);
}
//최솟값을 answer에 저장
if (answer > result.size()) answer = result.size();
}
return answer;
}
중요한건.
1. string sTemp = s.substr(8, 100);
s의 사이즈가 8일때 8부터 하면 sTemp =""가 되서 저절로 마지막 문자열 처리가 된다.
s.substr(9,100);을 하면 런타임 에러난다.
2.또한 s.substr(6);이런식으로 쓰면 6번째부터 나머지 문자열들 다 짜른 결과물이 나오게 된다.
내가 취약한 문자열 다루기 방식.