프로그래머스 [문자열 압축] - 구현 Lv.2

JH.P·2022년 8월 4일

구현

  • 주어진 문제의 조건을 꼼꼼하게 읽고 구현하여 해결 가능한 문제이다.

로직

  • 주어진 문자열의 앞에서부터 순차적으로 잘라야 하므로, 1개 단위부터 순차적으로 자를 것이다.

    • 따라서 자를 단위 수를 담을 변수를 만들고, 반복이 돌 때마다 하나씩 증가시킬 것이다.
    • 그리고 자를 단위 수에 해당하는 반복 차례마다 완성할 문자열을 담을 변수를 만든다.
  • 반복을 시행하며, 자를 단위 수가 전체 문자열의 길이와 같을 때까지 반복한다. 길이를 초과하게 되면 반복을 종료하도록 한다.

  • 자를 단위 수에 해당하는 반복을 시작하기 전, 문자열의 처음 글자부터 자를 단위 수만큼의 길이를 잘라낸다. 이를 sliceStr이라 명명하겠다.

  • 문자열의 처음 글자부터 순회하며, 자를 단위의 길이만큼 잘라내며 sliceStr과 같은지 검사한다.

    • 만약 같다면, 횟수를 측정할 변수인 count를 1 증가시킨다.
    • 만약 같지 않을 때는 count의 값이 2 이상이면, 완성할 문자열에 해당 count와 sliceStr을 문자열로써 합한다. 2 미만이라면 sliceStr만 합한다.
    • 그리고 이제부터는 바뀐 문자열로 다시 반복되는지 검사해야 하므로, sliceStr을 해당 순회에서 잘라낸 문자열로 재 할당한다.
    • 그리고 count는 1로 재할당한다. (순회를 잘라낸 문자열 다음부터 시작할 것이기 때문이다.)
      - 그리고 순회는 잘라낸 다음 문자열부터 시작해야하기 때문에, i = i + num - 1로 할당한다.
  • 순회가 종료되어도, 완성된 문자열에 마지막으로 잘라낸 문자열이 합해지지 못했다.

    • 따라서 count가 2 이상일 때는, count와 함께 잘라낸 문자열을 합한다.
    • 2 미만인 경우는, 잘라낸 문자열만 합한다.
  • 순회가 종료되면 정답을 담을 배열에 해당 반복 차례에서 완성된 문자열을 담는다.

  • 반복이 모두 종료되면, 정담이 담긴 배열에서 가장 길이가 짧은 요소의 길이를 반환한다.

    코드

 function solution(s) {
    let num = 1
    const answer = []
    
    while(num <= s.length) {
        let count = 0
        let numStr = ''
        let sliceStr = s.slice(0, 0 + num)
        for(let i = 0; i < s.length; i++) {
            const rest = s.slice(i, i + num)
            if(rest === sliceStr) {
                count += 1
            } else {
                if(count >= 2) {
                    numStr = numStr + count + sliceStr
                } else {
                    numStr = numStr + sliceStr
                }
                sliceStr = rest
                count = 1
                i = i + num - 1
            }
        }
        answer.push(numStr)
        num += 1
    }
    return answer
}
 
profile
꾸준한 기록

0개의 댓글