Algorithm/Programmers

[프로그래머스] level 2 - 문자열 압축 (C++)

혜멘 2022. 2. 16. 00:11

문제풀이

#include <string>
#include <vector>
#include <cmath>

using namespace std;

int solution(string s) {

    int answer = s.size();
    
    // 압축단위가 문자열의 절반보다 길면 의미가 없음
    for (int i = 1; i <= s.size() / 2; i++)
    {
        int zip = 1; // 압축횟수
        int zip_len = 0; // 압축된 문자열 길이
        string comp; // 비교할 문자열

        // 압축단위로 나눈 몫 - 1 만큼 비교
        for (int j = 0; j < s.size() / i - 1; j++)
        {
            comp = s.substr(i * j, i);
            if (comp == s.substr(i * (j + 1), i)) zip++;
            else if (zip>1) { // 앞 문자열이 압축될 수 있으면 압축단위 + 압축횟수의 자릿수
                zip_len += i + (int)log10(zip) + 1;
                zip = 1;
            }
            else {
                zip_len += i; // 앞 문자열이 압축되지 않으므로 압축단위를 더함 
            }
        }
        // 모두 비교하고 마지막 비교문자열 처리
        zip > 0 ? zip_len += i + (int)log10(zip) + 1 : zip_len += i;
        // 나누어 떨어지지 않는 뒷자리는 그대로 더함
        zip_len += s.size() % i;
        // 가장 짧은 문자열
        if (answer > zip_len) answer = zip_len;
    }
    return answer;
}

 

  • 문제를 잘 파악하기. 잘못 해석해서 다른 풀이 하느라 시간 날리지 않기
  • 개수를 다룰때는 숫자가 0부터 시작하는지 1부터 시작하는지 잘 고려하기 (로그랑 같이 쓸때 주의)
  • 항상 도식화 하기 => 압축횟수 10 이상을 생각하지 못해서 숫자의 자릿수를 1로 고정했기 때문에 틀렸었음
  • 압축단위로 나누어 떨어지는 길이와 그렇지 않은 길이가 있는데, 나누어 떨어지지 않는 나머지 길이는 비교할 수 없으므로 비교반복문이 끝난 후 마지막에 더해주기만 함
  • #include <cmath> log10(), log()