본문 바로가기
알고리즘/프로그래머스

[프로그래머스][자바스크립트][Level2][카카오] 문자열 압축

by Benjamin_Choi 2021. 7. 22.
function solution(s) {
    if (s.length === 1) return 1;
    // make data 
    var length = Math.floor(s.length/2);
    var data = new Array(length).fill(null).map(() => new Array());
    
    for (let i = 1; i <= length; i++) {
        for (let j = 0; j < s.length; j += i) {
            data[i-1].push(s.substr(j, i))
        }
    }

    // compression
    var answer = data.map((arr) => {
        let num = 1; 
        return arr.reduce((acc, char, idx, org) => {
            if (org[idx+1] === char) {
                num++;
            } else {
                num !== 1 ? acc.push(num, char) : acc.push(char);
                num = 1;
            }
            return acc;
        }, []).join("").length;
    });

    // return min length
    return Math.min(...answer);
}

흐름도 가독성도 마음에 든다.

 

2차원 배열 만들 때 

new Array(length).fill([]);
new Array(length).fill(new Array());

이런 식으로 짜면 fill 안에서 사용한 array reference가 재사용되어 array 안의 array 들이 사실상 모두 동일한 배열을 가리키고 있어 문제를 일으킨다. 주의하자. 

 

https://stackoverflow.com/questions/966225/how-can-i-create-a-two-dimensional-array-in-javascript

  1. Array. from(Array(2), () => new Array(4))
  2. Array(2). fill(null). map(() => Array(4))
  3. Array(2). fill(Array(4)); // BAD! Rows are copied by reference.

 

댓글