프로그래머스 - 문자열 압축 (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