본문 바로가기
Algorithm/프로그래머스

[프로그래머스]2020 KAKAO BLIND RECRUITMENT : 문자열 압축 (level 2)(c++)

by HBGB 2020. 7. 6.

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

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자

programmers.co.kr

 

 

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

void concat_string(string &full, string &part, int cnt)
{
    // 중복이 2이상이면 숫자+문자 덧붙이기
    if (cnt > 1)
    {
        full += to_string(cnt);
    }
    // 중복없으면 문자만 덧붙이기
    full += part;
}

int solution(string s) {

    int len = s.size();
    int answer = len;

    // 자를 문자열 크기 : 1부터 len / 2의 크기
    for (int i = 1; i <= len / 2; ++i)
    {
        string last = "";
        string full = "";
        int cnt = 1;

        // 각 부분 문자열 : j인덱스부터 i의 크기로 문자열을 자르기 
        for (int j = 0; j < len; j += i)
        {
            int end = (j + i - 1 < len) ? i : len - j;
            string tmp = s.substr(j, end);

            // 이전 문자열과 같다면 카운트 추가
            if (last.compare(tmp) == 0)
            {
                ++cnt;
            }
            // 이전 문자열과 다르다면
            else
            {
                // 전체 문자열에 카운트 및 부분 문자열 더하기
                concat_string(full, last, cnt);

                last = tmp;
                cnt = 1;
            }
        }
        concat_string(full, last, cnt);

        // 최소길이 갱신
        answer = min((int)full.size(), answer);
    }
    
    return answer;
}

 

 

원래 레벨1이었던 것 같은데 레벨2로 분류가 바뀌었나보다.

전에 java로 풀었던 적이 있는데

C++로 다시한번 풀어보니 그때보다 풀이가 더 깔끔해졌다ㅋ.ㅋ 

 

직전 부분 문자열을 저장하고

매번 직전 부분 문자열과 비교해서 중복횟수를 카운팅 하면 된다!

댓글