알고리즘/프로그래머스
[프로그래머스][자바스크립트][Level2][카카오] 문자열 압축
Benjamin_Choi
2021. 7. 22. 01:51
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
- Array. from(Array(2), () => new Array(4))
- Array(2). fill(null). map(() => Array(4))
- Array(2). fill(Array(4)); // BAD! Rows are copied by reference.