본문 바로가기

알고리즘/프로그래머스

프로그래머스 - 카카오 2020 공채 - 문자열 압축 c++

728x90

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

 

코딩테스트 연습 - 문자열 압축 | 프로그래머스

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다. 간단한 예로 aabbaccc의 경우 2a2ba3c(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수

programmers.co.kr

프로그래머스 2단계를 풀다가 틀려서 배지를 획득을 못했는데, 이 문제가 나왔다.

첫번째 문제는 20분만에 풀어서 나름 시간이 충분하다고 생각했는데, 틀려서 분하다..

 

패인을 크게 2가지로 분석하자면

1. substr stl을 몰랐다. 왜냐하면 문자열 관련된 문제를 지금까지 하나도 안 풀어 봤기 때문이다. 

2. 1의 방법을 몰라서, 자른 문자열들을 string type의 array에 넣어 보려고 했는데,array의 원소의 개수를 파악하는데 애를 먹었다.

그림처럼 

int main(void){
string s[5] = {"aa","bb","ab","df"};
cout<< s->size();
}

을 실행했을때 내가 구해내고자 싶었던 값은 4였다. s에 원소가 4개가 있기 때문이다.

하지만 실행 결과는 2였다. 

 

차라리 벡터 containor를 이용할 걸그랬다. 하지만 디버깅하다가 말려서 생각이 안나더라. (vector를 이용하면 4 값이 잘 나온다.)

다 공부가 부족한 탓이겠지. 문자열 처리 관련 부분은 연습을 좀 더 해야될것 같다. 카카오에서 꼭 1 2번으로 나오는 유형같아 보이니까 연습해둬야한다.

 

다음은 소스코드.

검사하는 압축 길이를 1부터 n/2까지 돌리되, 나누어 떨어지지 않을 경우에는 한번 다시 더해줘야 하는 과정까지 해내야 한다. 

 

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

int solution(string s) {
    int len = s.size();
    int answer = len;
    for(int i=1; i<=(len/2); i++){
        string result = "";
        string temp = s.substr(0,i);
        int count = 1;

        for(int j=i; j<=len; j+=i){
            if(temp == s.substr(j,i))
                count++;
            else{
                if(count==1)
                    result += temp;
                else
                    result += to_string(count) + temp;
                temp = s.substr(j,i);
                count=1;
            }
        }
        if(len/i !=0)
            result += s.substr((len/i)*i);
        answer = min(answer,int(result.size()));
    }
    return answer;
}