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)];
(acc, cur)
과 같은 형태로 설정하지 않아도 된다는 점! (내가 원하는 형태로 자유롭게 활용해도 된다는 점을 인지하면서 코드를 짜보자!)