본문 바로가기

Algorithm/카카오기출

[프로그래머스] 문자열 압축 / substr

문제

 

 

풀이 1

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

int solution(string s) {
    int answer = s.length();
    int len = 0, count = 1;
    string a, before;
    
    for(int i=1; i<=s.length()/2; i++){
        len = 0;
        for(int j=0; j<s.length(); j+=i){
            a = s.substr(j, i);
            len += a.length();
            if(before == a){
                len -= a.length();
                count++;
            }
            else if(count > 1){
                string count_s = to_string(count);
                len += count_s.length();
                count = 1;
            }
            before = a;
        }
        
        if(count > 1){
                string count_s = to_string(count);
                len += count_s.length();
                count = 1;
        }
        if(answer > len) answer = len;
    }
    
    return answer;
}

정답만을 구하는 것이 목적이었기 때문에(int 값) 정답인 문자열을 구할 수 없었다.

 

 

 

풀이 2

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

int solution(string s) {
    string answer = s;
    int count = 1;
    string a, before;
    string ex = "";
    
    for(int i=1; i<=s.length()/2; i++){
        before = s.substr(0, i);
        for(int j=i; j<s.length(); j+=i){
            a = s.substr(j, i);
            if(before != a){
                if(count > 1) ex += to_string(count);
                ex += before;
                count = 1;
            }
            else {
                count++;
            }
            before = a;
        }
        
        if(count > 1) ex += to_string(count);
        ex += before;
        count = 1;
        if(answer.size() > ex.size()) answer = ex;
        ex = "";
    }
    
    return answer.size();
}

다른사람 풀이를 본 후

정답인 문자열을 구해 그 size를 리턴할 수 있도록 수정했다!

 

 


 

 

다른 사람 코드

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

using namespace std;

vector<string> convert(string s, int n)
{
    vector<string> v;
    for(int i = 0 ; i <s.length() ; i+=n)
    {
        v.push_back(s.substr(i,n));
    }
    return v;
}

int solution(string s) {
    int answer = 0;
    vector<string> tok;
    string before;
    int cnt = 1;
    int min = s.length();
    string str="";
    for(int j = 1 ; j <= s.length()/2 ; j++)
    {
        tok = convert(s,j);
        str = "";
        before = tok[0];
        cnt = 1;
        for(int i = 1 ; i < tok.size() ; i++)
        {
            if(tok[i] == before) cnt++;
            else
            {
                if(cnt != 1) str += to_string(cnt);
                str += before;
                before = tok[i];
                cnt = 1;
            }
        }
        if(cnt != 1)str += to_string(cnt);
        str += before;  
        min = min<str.length() ? min : str.length();
    }
    cout<<str;

    return min;
}

문자열을 단위별로 잘라 벡터에 넣어 문제를 해결했다.