[프로그래머스 레벨투] 문자열 압축 📠

9rganizedChaos·2021년 10월 1일
0
post-thumbnail

🔽 문제 링크

https://programmers.co.kr/learn/courses/30/lessons/60057

✍🏼 나의 수도 코드

  1) 문자열과 압축 단위 숫자를 매개변수로 받아 압축된 문자열을 반환하는 compress 함수를 만든다.
  2) 1부터 s.length / 2 까지 반복문을 통해서, compress 함수를 돌려준다.
  3) 반복문 외부에 result 변수를 만들어준다. (result의 초기 값은 s.length)
  4) 반복문에서 출력된 결과가 기존 result에 저장된 값보다 작으면 result 값을 재할당한다.
  5) 반복문이 다 돌고나면 result를 return한다.

👨🏻‍💻 나의 문제 풀이

function solution(s) {
   
    let result = s.length
    
    function compress(s, num){
        let slicedArr = [];
        let condNum = s.length / num;
        
        for(let i = 0; i < condNum; i++){
            let slicedStr = s.substring(0, num);
            slicedArr.push(slicedStr);
            s = s.substring(num);
        }
        
        let tempStr = slicedArr[0];
        let count = 1;
        let compressedStr = "";
        
        for (let i = 1; i < slicedArr.length + 1; i ++){
            if(tempStr === slicedArr[i]){
                count++;
            } else {
                if(count === 1){
                   compressedStr += tempStr; 
                } else {
                   compressedStr += count + tempStr;
                }
                count = 1;
                tempStr = slicedArr[i];
            }
        }
        return compressedStr;
    }
    
    for(let i = 1; i <= s.length / 2; i++){
        let compressed = compress(s, i);
        if(compressed.length < result){
            result = compressed.length
        }
    }
    
    return result;
}

👩🏻‍💻 다른 사람의 코드

const solution = s => {
  // 1 ~ s.length 까지가 담긴 Array를 만든다.
  const range = [...Array(s.length)].map((_, i) => i + 1);
  // 1 ~ s.length까지 map을 돌려 압축해서 하나의 배열에 담고, 이 중 최솟값을 리턴한다.
  return Math.min(...range.map(i => compress(s, i).length));
};

// 압축한 문자열을 리턴하는 함수
const compress = (s, n) => {
  const make = ([a, l, c]) => `${a}${c > 1 ? c : ''}${l}`;
  // ✨ 가장 신기했던 부분 ✨
  // 고차함수 reduce를 활용하면서, acc에 해당하는 변수로 [a, l, c]를 설정했다.
  // 여기서 a는 압축한 결과, l은 내가 짠 코드에서 tempStr, c는 count에 해당한다.
  // 나처럼 굳이 하나씩 변수를 선언하지 않고 배열로 묶었다는 점! 배울만한 점.
  return make(
    chunk(s, n).reduce(
      ([a, l, c], e) => e === l ? [a, l, c + 1] : [make([a, l, c]), e, 1],
      ['', '', 0]
    )
  );
};

// 문자열을 compress에서 넘겨받은 i를 기준으로 조각내는 함수
const chunk = (s, n) =>
  s.length <= n ? [s] : [s.slice(0, n), ...chunk(s.slice(n), n)];

🍯 알게 된 것들

  • reduce를 사용할 때 콜백함수의 매개변수 형태를 꼭 (acc, cur) 과 같은 형태로 설정하지 않아도 된다는 점! (내가 원하는 형태로 자유롭게 활용해도 된다는 점을 인지하면서 코드를 짜보자!)
profile
부정확한 정보나 잘못된 정보는 댓글로 알려주시면 빠르게 수정토록 하겠습니다, 감사합니다!

0개의 댓글