function solution(s) {
// 우선, s의 길이를 결과 길이 배열에 넣어준다
let result_lengths = [];
result_lengths.push(s.length);
// 반복문은 s의 길이 / 2 만큼까지만 반복할 수 있다
for(let i = 1 ; i <= Math.floor(s.length/2) ; i++){
// 새롭게 만들어진 str, 해당 단어의 반복횟수
let str = '', repeat = 1;
// s의 길이를 보존시켜야 하므로 이를 제어할 변수 s_copy
// j는 중복되는 단어를 만들 인덱스
// 중복단어 check, 남은 문자열을 나타내는 remain
let s_copy = s, j = i, check, remain;
// 반복문은 i부터 i만큼 증가시키면서, s의 길이보다 커지면 종료
for( j= i ; j <= s.length ; j+= i){
// j -i 부터 j-1까지의 인덱스 단어를 만듦
check =s_copy.slice(j-i,j);
// j부터가 나머지 s
remain = s_copy.slice(j, s.length);
// remain이 check로 시작하면 반복되는 단어
if(remain.indexOf(check) === 0){
repeat++;
}
// 그게 아니라면 반복안되는 단어
else {
// 반복횟수가 1이 아니면 숫자를 먼저 담아주고
if(repeat !=1){
str += repeat;
}
// 이후 자른 단어를 이어주고
// 반복횟수를 다시 1로 초기화
str += check;
repeat = 1;
}
}
// 만약아직 뒤에 나머지 문자열이 존재하면
// 이를 연이어 주어야 함
if(remain.length != 0 ){
str += remain;
}
// 최종적으로 만들어진 str의 길이를 넣어줌
result_lengths.push(str.length);
}
// 최소값 반환
return Math.min(...result_lengths);
}
function compressionString(count, str) {
let same_count = 1, compression_str = "";
let check_word = "";
// 처음 비교 문자열 만들어 주기
for (let i = 0; i < count; i++)
check_word += str[i];
// count 지점 부터 반복문 시작
for (let i = count; i < str.length; i += count) {
// 처음과 비교할 문자열 가져오기
const slice_str = str.slice(i, i + count);
// 앞뒤 단어가 같으면 count값 증가
if (check_word === slice_str) {
same_count++;
} else {
// 다를때, 1일 경우에는 숫자는 이어붙이지 않음
if (same_count === 1)
compression_str += check_word
else
compression_str += (same_count + check_word);
// 초기화 시켜주고, 비교할 문자열 바꿔주기
same_count = 1;
check_word = slice_str;
}
}
// 마지막 단어 이어 붙이는 작업
if (same_count === 1)
compression_str += check_word
else
compression_str += (same_count + check_word);
// 길이만 반환
return compression_str.length
}
function solution(s) {
let min_length = s.length;
// 문자열의 길이 반만 수행하면 된다
for (let i = 1; i <= Math.floor(s.length / 2); i++) {
// 가장 작은 문자열의 길이를 저장해나감
const result = compressionString(i, s);
if (min_length > result) {
min_length = result;
}
}
// 결과값 반환
return min_length;
}