🕊 Link

Lv2. 문자열 압축 Javascript
https://programmers.co.kr/learn/courses/30/lessons/60057

🧑🏻‍💻 Code(javascript)

function solution(s) {
  let min = s.length;
  for (let cutLength = 1; cutLength <= s.length / 2; cutLength++) {
    let regex = new RegExp(`.{1,${cutLength}}`, "g");
    const arr = s.match(regex);
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] === arr[i + 1]) {
        let front = arr[i - 1];
        if (typeof front === "number") {
          arr[i] = arr[i - 1] + 1;
          arr[i - 1] = 0;
        } else {
          arr.splice(i, 1, 2);
        }
      }
      const currentLength = arr.reduce((acc, cur) => {
        return cur !== 0 ? acc + String(cur).length : acc;
      }, 0);
      if (min > currentLength) min = currentLength;
    }
  }
  return min;
}

💡 Solution

function solution(s) {
  let min = s.length;
  // s.length / 2 보다 크면 압축이 더 이상 일어날 수 없음.
  for (let cutLength = 1; cutLength <= s.length / 2; cutLength++) {
    // cutLength 길이로 나누어주는 정규표현식
    let regex = new RegExp(`.{1,${cutLength}}`, "g");
    const arr = s.match(regex);
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] === arr[i + 1]) {
        // arr[i] 와 arr[i+1]은 경우
        let front = arr[i - 1];
        if (typeof front === "number") {
          // 앞의 숫자가 number 타입인 경우
          // arr[i]에 기존 앞의 숫자 +1을 할당, 앞의 숫자를 0으로 할당
          arr[i] = arr[i - 1] + 1;
          arr[i - 1] = 0;
        } else {
          // 앞의 숫자가 number가 아닌 경우 숫자 2로 대체
          arr.splice(i, 1, 2);
        }
      }
      // arr를 돌면서 0이면 넘어가고, 0이 아니면 그 글자 수를 더해줌.
      const currentLength = arr.reduce((acc, cur) => {
        return cur !== 0 ? acc + String(cur).length : acc;
      }, 0);
      // 최소값 업데이트
      if (min > currentLength) min = currentLength;
    }
  }
  return min;
}

👨🏻‍💻💭 Self Feedback

예전에 학습했던 정규표현식이 주효했던 문제.
현재 돌고있는 배열의 length를 줄이면 반복문 자체가 틀어질 수 있으니, 0을 넣는 식으로 해결.


  • 2021.04.20 - 최초 작성

댓글 환영 질문 환영
by.protect-me

profile
protect me from what i want

0개의 댓글