N

(프로그래머스 c++ KAKAO)문자열 압축 본문

프로그래머스 알고리즘/KAKAO

(프로그래머스 c++ KAKAO)문자열 압축

naeunchan 2020. 5. 6. 16:20
728x90
반응형

우선 answer에 s.size()를 넣어주어 최댓값으로 설정한다..!

 

이중 for문 중에서 첫 번째 for문은 자를 문자의 개수를 나타낸다.

cnt 변수는 같은 문자의 개수를 나타내고, tmp 변수는 압축한 문자열의 총 크기를 나타낸다.

current 문자열은 s[0] ~ s[i]개 까지 자른 문자열을 나타낸다.

 

두 번째 for문에서는 s 문자열에서 current와 같은 문자열이 있는지 확인하는 반복문이다.

current == s.substr(j, i)가 같다면 cnt++을 해준다.

만약 두 문자열이 같지 않다면 tmp에 자른 문자열의 길이를 더해준다.

이때, cnt가 1이라면 자른 문자열의 길이만 더해주고,

1이 아니라면 cnt를 문자열로 변환했을 때의 길이 + 자른 문자열의 길이를 더해준다.

(같은 문자가 1번 나오면 1은 생략하라고 했기 때문..!)

 

두 번째 for문을 빠져나오면 마지막으로 자른 문자열의 길이를 더해주지 않았기 때문에

똑같은 방식으로 tmp에 더해준다.

마지막으로 answer와 tmp를 비교해서 더 작은 길이를 answer에 넣어주고 반복하면 끝...!

#include <string>
#include <vector>
#include <iostream>

using namespace std;

int solution(string s) {
    int answer = s.size();
    
    for(int i = 1; i <= s.size() / 2 + 1; i++)
    {
        int cnt = 1, tmp = 0;
        string current = s.substr(0, i);
        
        for(int j = i; j < s.size(); j += current.size())
        {
            if(current == s.substr(j, i))
                cnt++;
            else
            {
                if(cnt == 1)
                    tmp += current.size();
                else
                    tmp += (to_string(cnt).size() + current.size());
                current = s.substr(j, i);
                cnt = 1;
            }
        }
        if(cnt == 1)
            tmp += current.size();
        else
            tmp += (to_string(cnt).size() + current.size());
        answer = tmp < answer ? tmp : answer;
    }
    return answer;
}
728x90
반응형