C++:: 프로그래머스 < 문자열 압축 >

jahlee·2023년 7월 4일
0

프로그래머스_Lv.2

목록 보기
66/106
post-thumbnail

주어진 문자열을 문자열 크기보다 작은 정수의 단위로 나누어서 압축가능한지를 확인하고 가장 작은 길이를 리턴해야하는 문제이다.
문제가 이해하면 간단하지만 이해하기 좀 어려운 문제일 수 도 있다.
겪었던 문제를 간단하게 설명하면
마지막 예제 케이스인 "xababcdcdababcdcd"에 대한 부분에서 처음에는 단순히 같은 동일한 크기의 문자열이 내부에 존재하면
x2ababcdcd 와 같이 변형 할 수 있는중 알았지만
n의 크기로 나누어 압축한다 가정할때 시작점이 n의 크기의 배수가 곧 비교하는 문자열이 된다는 점을 알아야한다.

이에대한 예시로 "abcabcabcabcdededededede" 에서 4개씩 나누어 압축하면
|abca|bcab|cabc|dede|dede|dede 와 같이 |가 있는 부분에서 이어지는 동일한 문자열이 있는지를 판단하면 된다는 의미이다.
문자열이 n으로 딱 나누어 떨어져야한다는 의미는 아니기 때문에 주의하자.

#include <string>
#include <vector>
using namespace std;

int cntCompressedStr(int cnt, string s) {
    for (int i=0; i<s.size();) {
        string cmp = s.substr(i, cnt);// 비교 문자열
        int sameCnt = 1;// 비교 문자열과 같은 문자열 개수(비교 문자열 포함)
        for (int j=i+cnt; j<s.size(); j+=cnt) {// 같다면 개수++
            if (cmp == s.substr(j, cnt)) sameCnt++;
            else break;
        }
        if (sameCnt == 1) {
        // 해당 비교문자열이 뒤에 연속으로 반복되지 않는다면 자르는 단위만큼 i값에 cnt를 더한다.
            i += cnt;
            continue;
        }
        cmp = to_string(sameCnt) + cmp;// 비교문자열과 같은 문자열 개수 + 비교문자열 을 한 문자열로 합쳐준다.
        string rest = s.substr(i + cnt * sameCnt);// 나머지 문자열
        s =  s.substr(0, i) + cmp + rest;// 변환한 문자열을 다시 합쳐준다.
        i += cmp.size();//변환한 이후부터로 다시 인덱스 설정
    }
    return s.size();
}

int solution(string s) {
    int answer = s.size();// 압축을 못한다면 원래크기
    for (int i=1; i<=s.size(); i++) {// 1~문자열 크기 만큼으로 압축할때
        answer = min(answer, cntCompressedStr(i, s));
    }
    return answer;
}

0개의 댓글