[Programmers]문자열 압축/JS

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

접근방법

문자열 단위를 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