Lv2. 문자열 압축 Javascript
https://programmers.co.kr/learn/courses/30/lessons/60057
function solution(s) {
let min = s.length;
for (let cutLength = 1; cutLength <= s.length / 2; cutLength++) {
let regex = new RegExp(`.{1,${cutLength}}`, "g");
const arr = s.match(regex);
for (let i = 0; i < arr.length; i++) {
if (arr[i] === arr[i + 1]) {
let front = arr[i - 1];
if (typeof front === "number") {
arr[i] = arr[i - 1] + 1;
arr[i - 1] = 0;
} else {
arr.splice(i, 1, 2);
}
}
const currentLength = arr.reduce((acc, cur) => {
return cur !== 0 ? acc + String(cur).length : acc;
}, 0);
if (min > currentLength) min = currentLength;
}
}
return min;
}
function solution(s) {
let min = s.length;
// s.length / 2 보다 크면 압축이 더 이상 일어날 수 없음.
for (let cutLength = 1; cutLength <= s.length / 2; cutLength++) {
// cutLength 길이로 나누어주는 정규표현식
let regex = new RegExp(`.{1,${cutLength}}`, "g");
const arr = s.match(regex);
for (let i = 0; i < arr.length; i++) {
if (arr[i] === arr[i + 1]) {
// arr[i] 와 arr[i+1]은 경우
let front = arr[i - 1];
if (typeof front === "number") {
// 앞의 숫자가 number 타입인 경우
// arr[i]에 기존 앞의 숫자 +1을 할당, 앞의 숫자를 0으로 할당
arr[i] = arr[i - 1] + 1;
arr[i - 1] = 0;
} else {
// 앞의 숫자가 number가 아닌 경우 숫자 2로 대체
arr.splice(i, 1, 2);
}
}
// arr를 돌면서 0이면 넘어가고, 0이 아니면 그 글자 수를 더해줌.
const currentLength = arr.reduce((acc, cur) => {
return cur !== 0 ? acc + String(cur).length : acc;
}, 0);
// 최소값 업데이트
if (min > currentLength) min = currentLength;
}
}
return min;
}
예전에 학습했던 정규표현식이 주효했던 문제.
현재 돌고있는 배열의 length를 줄이면 반복문 자체가 틀어질 수 있으니, 0을 넣는 식으로 해결.
댓글 환영
질문 환영
by.protect-me