풀이 소요시간 : 약 30분
정통적인 슬라이딩 윈도우
를 떠올리면 풀 수 있었다. 다만 제출 후 다른 풀이를 참고하니 훨씬더 간결하게 구현할 수 있었다. 일단 코드부터 보자.
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
int Ans = 9999;
void Check_Zip(string s, int count)
{
string Result = "";
string Temp = s.substr(0, count);
int Same = 1;
for(int i = count; i < s.length(); i += count)
{
string Curr = s.substr(i, count);
if(Temp == Curr) Same++;
else
{
if(Same == 1)
{
Result += Temp;
}
else
{
Result += to_string(Same) + Temp;
Same = 1;
}
Temp = Curr;
}
}
//마지막 문자열 처리
if(Same == 1)
{
Result += Temp;
}
else
{
Result += to_string(Same) + Temp;
}
int Len = Result.length();
Ans = min(Ans, Len);
}
int solution(string s) {
for(int i = 0; i <= s.length() / 2; i++)
{
Check_Zip(s, i + 1);
}
return Ans;
}
투 포인터를 많이 구현해본 적이 없어서 구현에 뻣뻣함이 남아있다. 그래도 코드가 엄청 긴건 아니다. 중요 포인트는 마지막 Curr
문자열 대상으로 한번 더 처리를 해주어야 한다는 사실인데, 전에 실수했던 부분 중 하나지만 또 해버리고 말았다. 또한 인덱스 처리가 상당히 더러운 것을 볼 수 있다.
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
#include <iostream>
using namespace std;
int Ans = 9999;
void Check_Zip(string s, int count)
{
string Fin = "";
string Temp = s.substr(0, count);
string Curr = "";
int Same = 0;
int en = 0;
for(int st = 0; st < s.length(); st++)
{
while(en - st < count && en < s.length())
{
Curr += s[en];
en++;
}
//en - st = count 상태
if(Curr == Temp)
{
if(en != count) Same++;
}
else
{
if(Same > 0)
{
string Insert = to_string(Same + 1) + Temp;
Fin += Insert;
Same = 0;
}
else if(Same == 0)
{
Fin += Temp;
}
Temp = Curr;
}
Curr = "";
st = en - 1;
}
// 마지막 문자열 검증 진행
if(Same > 0)
{
string Insert = to_string(Same + 1) + Temp;
Fin += Insert;
Same = 0;
}
else if(Same == 0)
{
Fin += Temp;
}
int Len = Fin.length();
Ans = min(Ans, Len);
}
int solution(string s) {
for(int i = 0; i < s.length(); i++)
{
Check_Zip(s, i + 1);
}
return Ans;
}