Programers:文字列圧縮(2020 KAKAO BLIND RECRUITMENT)


文字列圧縮



コード#コード#

#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 11:38 시작
int solution(string s) {
    int answer = 0;
    // 문자열이 n일때  1 ~ n/2개 단위로 자를때 까지 구해서 최솟값을 찾아야 한다 (홀수포함)
    int until = s.length()/2;
    vector<string> arr(until, "");
    vector<int> result;
    /* 문자열이 1개일 때 1로 바로 리턴 - 예외처리 */
    if(s.length() == 1) return 1;

    /* slice는 문자를 자르는 단위! */
    for(int slice=1;slice<=until;slice++)
    {
         /* 비교할 기준이 되는 문자의 반복문 */ 
        for(int i=0;i<s.length();)
        {
            int cnt=1;
            /* 비교되는 문자! */
            string fix = s.substr(i,slice);
            /* 비교할 대상이 되는 문자의 반복문 - 마지막 요소를 마저 추가하기 위해 +slice 처리 */
            for(int j=i+slice;j<s.length()+slice;j+=slice)
            {
                string comp;
                if(j < s.length()) comp = s.substr(j,slice); 
                else comp = " ";
                if(fix == comp) cnt++;
                else if(cnt > 1){
                    string tmp = to_string(cnt) + fix;
                    arr[slice-1] += tmp;
                    break;
                }else {
                    arr[slice-1] += fix;
                    break;
                }
            }
            i += cnt*slice;
        }
    }

    for(auto a:arr) 
        result.push_back(a.length());

    answer = *min_element(result.begin(), result.end());
    return answer;
}
  • 文字列がnの場合、個数を求めてから最小値を求めなければなりません(
  • )
    構造は
  • 3のfor文で構成されています
    1)Slice for Moon:1からn/2ユニットの大きなフレーム
    2)比較基準となる文字
    3)比較する文字
  • は例外であり、文字列が1の場合は直ちに処理
  • に戻る必要がある.