프로그래머스 LV2 #8 문자열 압축
이 문제에 대한 저의 접근법은 문자열을 1개~(문자열 전체 숫자의 반)까지 쪼개면서 얼마나 많은 패턴이 연속으로 일치하는지 검증했습니다.
주석에 적혀있는대로 이전에 담아둔 문자열과 일치하는지를 확인하고 일치한다면 stack 숫자를 1씩 늘려가는 방식으로 작성했습니다.
그리고 최종에는 글자 숫자가 딱 나눠떨어지지 않는 부분을 더해줘서 오차를 없앴습니다.
매우 직관적인 풀이법으로 풀었습니다.
let solution = s => {
let answer = 1;
for(let j=1; j<=Math.floor(s.length/2); j++){
let prev = "";
let res = "";
let stack = 1;
for(let i=j; i<=s.length; i=i+j){
let next = s.slice(i-j, i); // slice(a, b)는 b-1까지의 문자열
// 첫 반복인 경우
if(prev === ""){
prev = next;
continue;
}
// 이전 것과 일치하는 경우 (압축 가능)
if(next === prev){
stack += 1;
continue;
}
// 이전 것과 일치하지 않는 경우 (압축 불가능)
res += (stack === 1 ? "" : "" + stack) + prev;
prev = next;
stack = 1;
}
res += (stack === 1 ? "" : "" + stack) + prev;
let resLength = res.length + (s.length % j);
if(answer === 1 || answer > resLength){
answer = resLength;
}
}
return answer;
};
추후에 다른 사람들의 풀이도 추가하여 포스팅을 수정하겠습니다.