<문자열 압축>
: 알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는 문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성한다. 단 반복횟수가 1인 경우 생략한다.
KKHSSSSSSSE가 들어오면 K2HS7E가 반환된다.
- cnt라는 변수를 선언하여, 1로 초기화한다. (무조건 하나는 있으므로 1로 초기화함)
- 제일 끝에 있는 인덱스를 위해 문자열에 공백을 더해준다.
- for문을 돌리는데, 만약 s[i]===s[i+1]이면 cnt++;해주고, 아니면 answer에 s[i]를 넣어주고 추가로 cnt가 1초과라면 cnt의 값도 넣어준다.
- 이 부분을 확실히 이해해야 하는 거 같다. for문이 계속 돌아가면서 cnt++;하다가 if문의 s[i]===s[i+1]이라는 조건을 충족하지 못해서, else로 간다는 점! 이 부분이 핵심인 듯.
<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>
이놈아!!! 주말에 공부 왜 안하냐고!!!
<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)에만 +=할 수 있도록 했다. 좀 복잡하고 설명하면서도 하하하... 그래도 포기하지 않고 잘했군!!! 하지만 직관적이지 못함