[programmers] Lv2. 文字列圧縮JavaScript|protect-me


🕊 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
以前学んだ正規表現が主導的な問題を占めている.
現在回転している配列の長さを減らすと、繰り返し文自体が歪む可能性があるため、0を加えることで解決できます.
  • 22021.04.20-
  • が最初に作成されました.댓글 환영 질문 환영 by.protect-me