2022/01/10) 5. 문자열 압축 [문자열 탐색]

굥굥이·2022년 1월 10일
0
post-thumbnail

1. 문제

<문자열 압축>
: 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성한다. 단 반복횟수가 1인 경우 생략한다.
KKHSSSSSSSE가 들어오면 K2HS7E가 반환된다.

2. 해결 방법

  1. cnt라는 변수를 선언하여, 1로 초기화한다. (무조건 하나는 있으므로 1로 초기화함)
  2. 제일 끝에 있는 인덱스를 위해 문자열에 공백을 더해준다.
  3. for문을 돌리는데, 만약 s[i]===s[i+1]이면 cnt++;해주고, 아니면 answer에 s[i]를 넣어주고 추가로 cnt가 1초과라면 cnt의 값도 넣어준다.
  4. 이 부분을 확실히 이해해야 하는 거 같다. for문이 계속 돌아가면서 cnt++;하다가 if문의 s[i]===s[i+1]이라는 조건을 충족하지 못해서, else로 간다는 점! 이 부분이 핵심인 듯.

3. 정답

        <script>
            function solution(s){
                //무조건 하나는 있으므로 1로 초기화한다.
                //조건을 s[i]===s[i+1]로 주고, 만약 조건에 성립하면 cnt++; / 아니면 그냥 패스
                let answer = "";
                let cnt = 1; //1로 초기화
                s=s+" ";
                for(let i = 0; i < s.length - 1; i++){
                    if(s[i] === s[i+1]) cnt++;
                    else{
                        answer += s[i];
                        if(cnt>1) answer+=String(cnt);
                        cnt=1; //위치 조심! 
                    }
                }
                return answer;
            }
            let str="KKHSSSSSSSE";
            console.log(solution(str));
        </script>

4. 내 코드와 비교 그리고 반성과 칭찬

이놈아!!! 주말에 공부 왜 안하냐고!!!

        <script> //내 코드
            function solution(s){
                //반복횟수가 1번이면 해당 문자만 출력된다. 
                //반복횟수가 2이상이면 해당 문자&반복 횟수도 출력된다.
                let answer = "";
                for(let x of s){ //문제점 
                    let num = 0;
                    for(let i = 0; i < s.length; i ++){ 
                        if(x === s[i]){
                            num++; //문제점  
                        } 
                    }
                    if(num === 1){
                        answer += x; 
                    } else if(answer.indexOf(x) === -1) { //answer에 x가 없을 때만 +=할 수 있음. 만약 있다만 += 하지 않고 패스됨
                        answer += (x + num);
                    }
                }
                return answer;
            }
            let str="KKHSSSSSSSE";
            console.log(solution(str));
        </script>

그리고 내가 짠 코드의 문제점도 발견했다!! 일단 처음에 for..of로 한 문자(x)씩 들어오게 한 다음 for문을 돌려 x의 개수를 구하는 코드를 짰었다. 그런데 내부에 if(x===s[i])num++; else num=0; 이런 식으로 짜서, 예를 들어 K라는 값이 들어왔을 때 num의 값이 2가 됐다가 다시 0으로 초기화됐다. 그리고 외부 for문의 조건을 let x of s로 줘놓고, 이 for문안에서 answer에 += 하니, x개수만큼 값이 출력돼서 정말 이상하게 출력됐다. 그리하여 출력할 때의 조건을 answer.indexOf(x)하여 없을 경우(-1)에만 +=할 수 있도록 했다. 좀 복잡하고 설명하면서도 하하하... 그래도 포기하지 않고 잘했군!!! 하지만 직관적이지 못함

profile
아자아자 파이띵굥!

0개의 댓글