[プログラマー]2020 KAKAO BLIND RECRUIMENT Lv 2文字列圧縮



https://programmers.co.kr/learn/courses/30/lessons/60057

スケッチ




プログラマーLv 2に初挑戦!
問題を見て彷徨っていると本当にうろうろしてしまうので、元気を出すべきだと思います.ははは

トラブルシューティングプロセス


そこで今回は、スケッチ時の1~3単位の圧縮手順を手でシミュレートします.
変数や例外処理などを再三考慮する
文字列がタイムアウトするかどうかずっと心配していました.
私はできるだけ繰り返し回数を減らすべきだと思います.
だから、まず簡単にいくつかの単位をチェックしますか?悩ましい
単位が文字列の長さの半分+1以上であれば意味がありません.1つ以上の重複は起こらないからです.
ex)長さが8の場合、単位5から意味がありません
文字列の長さの半分まで単位だけをチェックします
次に、単位で文字を入力します.
最初は、文字列からロールを抽出して単位の長さに合った文字列を作成する方法を想定しました.
しかしこの場合、単位が1、2、10であっても文字列の長さを繰り返すので効率的には見えません!
したがって,substrを用いて単位長で文字列をインポートする.
複文でもunitをスキップし、繰り返し回数を減らしました
この質問に答えると、
まず圧縮部分を実現し,次に圧縮文字列の最短長の求め部分を実現する.
異なるモジュール単位で実施した.
まず、実装された圧縮部分をテストして、最短の長さを得る.
期待した結果がなければ、短い長さの部分のコードを求めることに注意すればいいので、この点は気持ちがいいです!
終わったら答えは正しい.
もう一度見て、コードが重複している部分を見て、修正しました!
10行ほど減らすことができます
スケッチとは違って
現在の文字列のtを格納するだけでなく、次の文字列の変数を格納する必要があります.
反復のたびにcurtとnexttを比較し、対応する処理を行うためです.

学識


1.stringのsubstr(pos,count)

string s = "abcabcdede"
cout<<s.substr(0, 3)<<endl // abc
-文字列のpos 1文字目からcount長で文字列の一部を取得

2.文字列の比較

  • 申し訳ありませんが、使用するたびに混同され、文字列が一致すると0
  • を返します.
  • 反復文でif(curt.compare(nextt))を使用すると、2つの文字列の条件が異なります.
  • 修正されたコード

    #include <iostream>
    #include <string>
    using namespace std;
    
    int solution(string s) {
        string curT, nextT, result;
        
        int count = 1;
        int len = s.length();
        int answer = len;
        
        for(int unit=1; unit<=(len/2); unit++)
        {
            curT = s.substr(0, unit);
    
            int i = unit;
            while (true)
            {
                /* 예외: 남은 글자 수가 단위보다 적은 경우 */
                if(i+unit > s.length())
                {
                    if (count > 1)
                        result.append(to_string(count));
                    result.append(curT);
    
                    for (int j = i; j < s.length(); j++)
                        result.push_back(s[j]);
                    break;
                }
    
                nextT = s.substr(i, unit);
    
                if (!curT.compare(nextT))
                {
                    count++;
                }
                else
                {
                    if (count > 1)
                    {
                        result.append(to_string(count));
                        count = 1;
                    }
                    
                    result.append(curT);
                    curT = nextT;
                }
                i += unit;
            }
    
            if(answer > result.length())
                answer = result.length();   
    
            result.clear();
            count = 1;
        }
        
        return answer;
    }

    変更前のコード

    #include <iostream>
    #include <string>
    using namespace std;
    
    int solution(string s) {
    
        string curT;
        string nextT;
        string result;
        
        int count = 1;
    
        int len = s.length();
        int answer = len;
        for(int unit=1; unit<=(len/2); unit++)
        {
            curT = s.substr(0, unit);
    
            int i = unit;
            while (true)
            {
                if (i + unit <= s.length())
                {
                    nextT = s.substr(i, unit);
                }
                else
                {
                    if (count > 1)
                    {
                        result.append(to_string(count));
                    }
                    result.append(curT);
    
                    for (int j = i; j < s.length(); j++)
                    {
                        result.push_back(s[j]);
                    }
                    break;
                }
    
    
                if (!curT.compare(nextT))
                {
                    count++;
                }
                else
                {
                    if (count > 1)
                    {
                        result.append(to_string(count));
                        result.append(curT);
                        count = 1;
                    }
                    else
                    {
                        result.append(curT);
                    }
                    curT = nextT;
                }
                i += unit;
            }
            
            if(answer > result.length()) 
                answer = result.length();
        
            result.clear();
            count = 1;
        }
        return answer;
    }