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




문자열 압축

프로그래머스

나의 풀이 (실패)

function solution(s) {
  let temp = [];
  for (let i = 1; i <= s.length; i++) {
    temp.push(s.replace(new RegExp(`([a-z]{${i}})\\1+`, 'g'), x => x.length / i + x.substring(0, i)));
  }
  return temp.reduce((acc, cur) => (acc = cur.length < acc ? cur.length : acc), Number.MAX_SAFE_INTEGER);
}
  • 정규식으로 해결하고 싶었지만 앞에서부터 동일한 갯수를 잘라나가야한다는 처리를 못해서 실패
  • 너무 슬프지만 정규식에 변수 처리하려고 new RegExp 문자열 처리할 때 \1을 \1 해야한다는 것을 1시간 30분 삽질을 통해 알았다.


정답 코드

function solution(s) {
  let answer = s.length;

  for (let i = 1; i <= s.length / 2; i++) {
    let cnt = 1;
    let compressionStr = '';
    let target = s.substring(0, i);

    for (let j = i; j <= s.length; j += i) {
      if (target === s.substring(j, j + i)) cnt++;
      else {
        if (cnt === 1) compressionStr += target;
        else compressionStr += cnt + target;
        target = s.substring(j, j + i);
        cnt = 1;
      }
    }

    if (cnt === 1) compressionStr += target;
    else compressionStr += cnt + target;
    answer = Math.min(answer, compressionStr.length);
  }
  return answer;
}

문제 기본 원리에 정말 충실한 해결법
괜히 정규식으로 풀겠다고 머리 썼다가 \ 에 걸려서 삽질 대장정을 했다 ㅠ