문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/60057
접근방법
문자열 단위를 1부터~ 문자열 길이의 절반까지만 지정해서 압축하면 되겠다라는 생각이 가장 먼저 떠올랐다.
slice 함수를 사용해서 문자열 단위로 잘라서 비교하고
(slice() -> 원본에 영향X, splice() -> 원본에 영향O 또 까먹어서 또 구글링해봄ㅋ)
반복되는 것들을 스택에 저장해야겠다!
결론부터 말하자면 스택은 필요없었따...
반복되는 문자열이 무엇인지보다는 몇 번 반복되는지가 중요했고
"abcabc" "abcabcabc"
위의 문자가 압축된 결과는 2abc, 3abc 이므로 결과적으로 4글자가 된다
정답코드
function solution(s) {
var answer = s.length;
//문자열 길이의 절반까지만 비교
for (let i = 1; i <= Math.floor(s.length / 2); i++) {
let result = "";
let count = 1; //반복 횟수 저장
let temp = s.slice(0, i);
for (let j = i; j < s.length; j += i) {
const current = s.slice(j, j + i);
if (temp === current) {
count++;
} else {
result += (count > 1 ? count : "") + temp;
temp = current;
count = 1;
}
}
//남은 문자열 처리
result += (count > 1 ? count : "") + temp;
answer = Math.min(answer, result.length);
}
return answer;
}
count 변수를 선언해서 반복 횟수를 세준다.
temp와 current에 저장된 문자를 비교하고 같으면 count에 1을 더해주고
같지 않으면!!
(여기가 제일 어려웠던 부분)
count 변수를 확인해서 result에
1보다 크다(반복된 문자열이다) -> count + temp
1이다(반복되지 않은 문자열이다) -> temp
를 붙여주면 된다.
마지막에 남은 문자열을 처리해주면 끝!
'Programmers' 카테고리의 다른 글
[Programmers]다트 게임/JS (8) | 2024.03.29 |
---|---|
[Programmers]롤케이크 자르기/JS (0) | 2024.02.24 |
[Programmers]혼자 놀기의 달인/JS (0) | 2024.02.19 |
[Programmers]삼각 달팽이/JS (1) | 2024.02.01 |
[Programmers]땅따먹기/JS (0) | 2024.02.01 |