Algorithm/JavaScript

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

🥭맹2 2021. 5. 7. 23:37

1. 문제

programmers.co.kr/learn/courses/30/lessons/60057?language=javascript

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

2. 접근 방법

앞에서부터 n개씩 잘라서 같은 경우 숫자로 바꿔준다.

여기서 숫자로 바꾸다가 현재 최소 길이보다 크면은 break조건을 넣어줬따.

3. 코드

Javascript

function solution(s) {
    var answer = s.length;
    
    if (s.length === 1) {
        return 1;
    }
    
    for (let i=1; i<s.length; i++) {
        let temp = ''
        let cnt = 1;
        let prev = s.slice(0, i)
        for (let j=i; j<s.length; j+=i) {
            var now
            if (j+i >= s.length) {
                now = s.slice(j, s.length)
            } else {
                now = s.slice(j, j+i)   
            }
            if (prev === now) {
                cnt ++;
            } else {
                if (cnt > 1) {
                    temp += (String(cnt)+prev)
                } else {
                    temp += prev
                }
                prev = now
                cnt = 1
            }
            if (temp.length >= answer) {
                break
            }
        }
        if (cnt > 1) {
            temp += (String(cnt)+now)
        } else {
            temp += now
        }
        if (temp.length < answer) {
            answer = temp.length
        }
    }
    return answer;
}

4. 마치며

파이썬이라면 ㅠ 어렵지 않았을텐데, 구현하느라 너무 오래걸렸다.
구현이 어려웠던 이유는

1. for문에서 1씩 증가하는 것만 사용하다가 -> n개씩 증가할 때 구현을 어떻게 하지 ?!?!?!? 였다.

for (let i=0; i<s.length; i++) {
}

for (let i=0; i<s.length; i+=10) {
}

zzznara2.tistory.com/736

 

[자바스크립트] javascript에서 1이상 증가하는 for문 사용 예제

자바스크립트 for문은 항상 이렇게 사용했었는데... for( var i = 0; i < length; i++ ) { ...... } 10씩 증가하는 for문이 필요해서 다음과 같이 해봤는데 작동이 안되더군요 ㅠ for( var i = 0; i < length; i+1..

zzznara2.tistory.com

여기를 참고했는데, 다시 생각해보면 i++이 i+=1이므로 i+=10인게 맞는데 ㅋㅋㅋㅋㅋㅋ 왤케 어렵게 생각한거지 나ㅠ

약간 자바스크립트에 쫄아버림;;

 

2. slice

 

파이썬은 그냥 s[:i]같이 슬라이싱이 되는데 ㅋㅋㅋㅋㅋㅋㅋ ㅠ

자바스크립트는 아니더라 ...

s.slice(0, i)처럼 시작 idx와 끝 idx를 넣어줘야한다.

당근 0이상 i미만 ..

 

3. now를 var로 선언

 

for 문 안에서 now를 let으로 선언했더니 블록 레벨에서 선언되었기 때문에 블록 레벨 스코프를 갖는 변수가 되어 .. for문을 다 돌고 나서 마지막에 남은 now를 더해주는 과정에서 더해지지 않았다 ^^ 

그래서 즈엉말 어쩔 수 없이 var를 썼다. (var는 최소한으로 쓰고싶은 나 ..)

 

4. 처음에 초기 answer 값을 최댓값으로 넣어주려고 하는데, 자바스크립트에서 최댓값은 뭐지 ????

 

developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Number

 

Number - JavaScript | MDN

Number 객체는 숫자 값으로 작업할 수 있게 해주는 래퍼wrapper 객체입니다. Number 객체는 Number() 생성자를 사용하여 만듭니다. 원시 숫자 자료형은 Number() 함수를 사용해 생성합니다.

developer.mozilla.org

Number에서 안전한 최대 정수는 Number.MAX_SAFE_INTEGER 라고 한다 !

 

근데 어차피 여기서 최댓값은 현재 문자 길이니께 구냥 했다 흥

 

5. 다른 사람 코드인데 .. 스트링 리터럴을 쓴 걸 보고 소오름

와 스트링 리터럴 쓸 생각은 못했다.