[프로그래머스] 문자열 압축 lv2

SeHoony·2022년 8월 20일
1

코테준비

목록 보기
12/27

1. 문제

문자열 압축 lv2
https://school.programmers.co.kr/learn/courses/30/lessons/60057

2. 원래 풀이

참 신기한게, 딱 한 케이스 빼고 다 통과했다...
뭘까?
그리고 한케이스 틀리는 데까지 47분 걸렸다. 갈 길이 머니까 뛰어가야지!

function solution(s) {
    var answer = 0;
    
    let mini = new Array(1001)
    mini.fill('a')
    mini = mini.join('')
    
    for(let i = 1; i <= Math.round(s.length/2) ; i++){
        let str = ''
        let count = 0
        let now = s.slice(0,0+i)
        
        for(let j = 0; j < s.length ; j += i){
            if(now === s.slice(j,j+i)){
                count ++
            }
            else{
                str += count === 1 ? now : count.toString()+now
                now = s.slice(j,j+i)                
                count = 1
            }
            if(j+i >= s.length){
                str += count === 1 ? now : count.toString()+now
            }
        }
        if(mini.length > str.length){
            mini = str
        }
    }
    answer = mini.length
    return answer;
}

이 문제에서 내가 배웠던 점은
제일 처음에 mini의 길이를 정하는 방법이다.
일단 s로 들어오는 문자열의 최대 길이는 1000이기 때문에 mini의 길이가 1001이면 된다.
근데 문자열 길이 정의하는 방법을 몰라 배열로 만들고 다시 join으로 묶어 1001 길이의 문자열을 만들어 주었다.

3. 개선 코드

굳이 mini를 문자열로 유지할 필요가 없다는 것을 깨달았다.

function solution(s) {
    var answer = 0;
    let mini = 1001
    
    for(let i = 1; i <= Math.round(s.length/2) ; i++){
        let str = ''
        let count = 0
        let now = s.slice(0,0+i)
        
        for(let j = 0; j < s.length ; j += i){
            if(now === s.slice(j,j+i)){
                count ++
            }
            else{
                str += count === 1 ? now : count.toString()+now
                now = s.slice(j,j+i)                
                count = 1
            }
            if(j+i >= s.length){
                str += count === 1 ? now : count.toString()+now
            }
        }
        if(mini > str.length){
            mini = str.length
        }
    }
    answer = mini
    return answer;
}

4. 유념하자

Math.floor()
Math.round()
Math.ceil()
Math.trunc()
profile
두 발로 매일 정진하는 두발자, 강세훈입니다. 저는 '두 발'이라는 이 단어를 참 좋아합니다. 이 말이 주는 건강, 정직 그리고 성실의 느낌이 제가 주는 분위기가 되었으면 좋겠습니다.

0개의 댓글