[프로그래머스] 문자열 압축 (자바스크립트/ javascript/ js)

2021. 6. 23. 19:01Front-end/알고리즘

728x90
반응형

문제출처: https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

 

 

문제를 풀기 위한 아이디어

일단은 1개부터 총 문자열 길이의 절반까지 모두 잘라서 비교해본다.

(이 때 문자열 길이의 절반까지로 하는 이유는 만약 문자열의 길이가 5개라면 2개까지는 잘라도 되지만 3개부터, 즉 과반수를 넘어가면 자르는게 의미가 없기 때문에 범위를 좁혀서 효율성을 더 높일 수 있다.

그러나 문자열의 길이가 1인 경우도 생각해야 하므로 Math.floor(s.length / 2) + 1을 해준다. 이 처리를 해주지 않으면 문자열이 1인 경우에는 문자열을 쪼개는 반복문이 실행되지 않아서 답이 잘 못 나오게 되기 때문이다.)

 

문자열을 길이에 맞춰서 자르기 위해서는 자바스크립트의 match 메소드를 이용하면 된다. match 메소드는 문자열이 정규식과 매치되는 부분을 검색하여 배열로 반환해주는 메소드이다. 이 때 플래그를 꼭 g를 써주어야 모든 문자열이 배열에 담긴다.

정규식에서 모든 문자를 나타내려면 . 으로 나타낸다. 그리고 {1, length}를 적어주는 이유는 최소 1부터 최대 length까지 잘라주는 것이기 때문이다. 최대한 length로 자르고 남은 것은 그대로 그냥 붙이기 위함이다.

 

그리고 반환된 array를 반복문으로 돌면서  map 객체를 이용한다.

만약 현재 돌고 있는 array[i]가 이전의 요소인 array[i-1]과 같다면 map에 value를 하나 증가시켜서 갱신한다.

그리고 answer에 push하면 된다. 

모든 반복문이 끝난 후 answerString은 answer를 join해서 붙인 문자열이 되고, 이 문자열이 최소값이 될 수 있도록 계속 더 작은 값이 나오면 갱신해준다. 

그리고 반복문의 마지막에서는 꼭 잊지말고 값들을 초기화해주어야 한다.

 

function solution(s) {
  let answer = [];
  let answerString = "";
  let min = 0;

  const cutString = (string, length) => {
    return string.match(new RegExp(`.{1,${length}}`, "g"));
  };

  for (let leng = 1; leng <= Math.floor(s.length / 2) + 1; leng++) {
    const array = cutString(s, leng);
    const map = new Map();
    for (let i = 0; i < array.length; i++) {
      if (i === 0) {
        answer.push(array[i]);
        map.set(array[i], 1);
      } else {
        if (array[i] === array[i - 1]) {
          map.set(array[i], map.get(array[i]) + 1);
          answer[answer.length - 1] = `${map.get(array[i])}${array[i]}`;
        } else {
          answer.push(array[i]);
          map.set(array[i], 1);
        }
      }
    }
    answerString = answer.join("");
    if (min === 0) {
      min = answerString.length;
    } else {
      if (answerString.length < min) {
        min = answerString.length;
      }
    }
    answer = [];
    answerString = "";
  }
  return min;
}
728x90
반응형