[Programmers] 문자열 압축(Lv.2)

Alice·2023년 8월 18일
0

풀이 소요시간 : 약 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;
}
profile
SSAFY 11th

0개의 댓글