프로그래머스 - 문자열 압축 (Lv.2)
          
  
    
    
    
      
      
      
        
        
          less than 1 minute read
        
      
    
  
        
      
      
        
          
        
        문제 링크
문제 설명
  - 문자열 s 가 주어진다.
- 문자열은 앞에서부터 정해진 개수만큼 잘라야 하고, 아래와 같은 압축 방법을 따른다.
    
      - 같은 문자열 패턴이 반복된다면 반복횟수+반복되는 문자열로 표현한다.
- 즉, abcabcdede 같은 경우 3개 단위로 자른다면 2abcdede가 된다.
 
- 가장 짧게 압축했을 때의 문자열 길이를 구하라.
문제 접근
  - 주어진 문자열을 앞에서부터 파싱하고, 벡터 컨테이너에 담는다.
- 벡터 컨테이너에 담긴 문자열을 서로 비교해가며 같은 문자열인 경우 반복해서 나온 횟수를 문자열 앞에 붙여주도록 한다.
구현(All Pass)
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<string> parse(string s, int len){
    vector<string> ret;
    string str;
    for(int i=0; i<s.length(); i++){
        if(str.length()==len){
            ret.push_back(str);
            str.clear();
        }
        str.push_back(s[i]);
    }
    if(str.length()>0) ret.push_back(str);
    return ret;
}
int compress(vector<string> parseStr){
    string compressed = "";
    int n = parseStr.size();
    int cnt=1;
    for(int i=0; i<n-1; i++){
        if(parseStr[i]==parseStr[i+1]){
            cnt++; continue;
        }
        if(cnt>1) {
            compressed += to_string(cnt);
            compressed += parseStr[i-1];
            cnt=1;
        }
        else{
            compressed += parseStr[i];
        }
    }
    // 마지막 파싱 부분 처리
    if(cnt>1){ // 마지막 문자열도 같은 경우
        compressed += to_string(cnt);
    }
    compressed += parseStr[n-1];
    return compressed.length();
}
int solution(string s) {
    int answer = 1001;
    vector<string> parseStr;
    for(int len=1; len<=s.length(); len++){
        parseStr = parse(s, len);
        answer = min(answer, compress(parseStr));
    }
    return answer;
}
 
    
      
    
  
Leave a comment