Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

코린이 탈출기

[2020 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 문자열 압축 본문

문제 풀이

[2020 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 문자열 압축

명란파스타 2020. 8. 28. 01:48

 

문제 풀어보기

 

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

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

programmers.co.kr

 

문제에서 요구하는 대로 구현하면 된다.

어렵지 않은 문제 !
그래 솔직히 첫 문제부터 어려우면 안되지.. 7문제나 내면서 ㅠ  ㅠ 궁시렁

 

C++은 string에 대한 함수가 너무 없어서 javascript로 풀어보았다

요새 IR센터 근무하면서 계속 자바스크립트를 다루다 보니 어느새 손에 익숙해져서,, ㅎ

크롬으로 디버깅 돌리는 게 너무 편해서 좋다. 알아서 코드 옆에 변수 값 어떻게 바뀌는지 다 보여준다 ~ 

 

<문제 풀이 Logic>

문자열을 제일 앞에서부터 정해진 길이만큼 잘라야 하기 때문에 split할 길이를 for문으로 돌리고 그 길이만큼 앞에서부터 잘라주면 된다. split할 길이를 정하는 for문은 문자열의 길이/2 만큼만 수행하면 된다. 

split한 문자열(now)과 그 전에 split한 문자열(prev)를 비교하여 같으면 same_cnt 증가, 다르면 tmp_answer(압축 문자열 길이)에 이때까지 압축된 길이를 더해준다. 그리고 same_cnt는 다시 0으로 초기화.

 

split할 길이를 어떻게 정하냐에 따라 tmp_answer은 달라지는데, 우리는 압축했을 때 가장 짧은 경우를 찾고 있기 때문에 tmp_answer의 min값을 구하면 된다.

 

 

-전체 코드-

<!DOCTYPE html>
<html>
<script>
    var s = "a";

    function digit(num) {
        var string_num = num.toString();
        return string_num.length;
    }

    function solution(s) {
        var answer = 0;
        var split = s.length / 2;
        var same_cnt = 0;

        if(s.length == 1)
            return 1;
            
        for (var sp = 1; sp <= split; sp++) {
            var tmp_answer = 0;
            var prev = null;
            for (var i = 0; i < s.length; i += sp) {
                if (prev == null) {
                    var prev = s.substr(i, sp);
                    continue;
                }
                var now = s.substr(i, sp);
                if (now == prev) {
                    same_cnt++;
                }
                else {
                    if (same_cnt != 0) {
                        tmp_answer += (sp + digit(same_cnt+1));
                        same_cnt = 0;
                    }
                    else {
                        tmp_answer += sp;
                    }
                }
                prev = now;
            }

            if (same_cnt != 0) {
                tmp_answer += (sp + digit(same_cnt));
                same_cnt = 0;
            }
            else {
                tmp_answer += now.length;
            }

            console.log(sp + " : " + tmp_answer);
            if (answer == 0)
                answer = tmp_answer;
            else {
                answer = Math.min(answer, tmp_answer);
            }
        }
        console.log(answer);
        return answer;
    }

    solution(s);
</script>

</html>