알고리즘/C++

[C++] 프로그래머스 문자열 압축 (2020 카카오 공채)

지휘리릭 2020. 2. 25. 17:52
#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    int answer = s.length();
    string result = "";
    string temp = "";
    int cnt = 1;
    
    if(s.length() == 1) return 1;

    // i : 문자열 압축 단위
    for (int i = 1; i <= (s.length() / 2); i++) {
        result = "";
        // 비교 문자열
        temp = s.substr(0, i);
       
       // 비교 문자열 시작 위치 j, 끝 위치 j+i
        for (int j = i; j <= s.length(); j+=i) {
            // 두 문자열이 일치하면 중복 카운트 +1
            if (temp == s.substr(j, i)) cnt++;

            else {
                // 두 문자열이 서로 다르다면 기존 문자열은 보내줘야 함
                // 기존 문자열이 1번만 나오면 숫자 안쓰고, 그 이상이면 문자열 앞에 숫자 추가
                if (cnt == 1) result = result + temp;
                else {
                    result = result + to_string(cnt) + temp;
                    cnt = 1;
                }
            }
            
            // 만약 비교하려는 다음 문자열이 i보다 길이가 짧은 경우, 길이가 달라 비교할 수 없으므로 여기서 마무리함
            // cnt == 1이면 어차피 위의 else 구문에서 문자열을 result에 추가했기 때문에, 버퍼에 남은 문자열만 넣음
            // cnt > 1 이면, 아직 temp를 정리하지 못했으므로 temp, cnt를 추가하고 버퍼에 남은 문자열도 추가
            if (j + i > s.length()) {
                if (cnt == 1) { result = result + s.substr(j); }
                else { result = result + to_string(cnt) + temp + s.substr(j);}
                break;
            }
            
            // 비교 문자열 갱신
            temp = s.substr(j, i);
        }
        answer = (answer > result.length() ? result.length() : answer);
    }
    return answer;
}