프로그래머스 JS 2단계 문자열 압축

이명진·2022년 3월 31일
0

코드카타

목록 보기
13/69

어느덧 프로그래머스 2단계를 풀고 있다. 2단계 부터는 효율성까지 체크하기도 하고 문제가 좀 복잡한 부분도 있어서 확실히 어렵다..

몇문제는 검색 찬스로 설명을 봐서 문제를 이해해놨다. 나중에 내힘으로 스스로 풀때까지 다시 풀어볼것이다.

이번에 힌트는 조금 봤지만 내힘 스스로 푼 문제를 드디어 벨로그에 적게 되었다.

문제는 문자열 압축 !
2020년도 카카오 코테 문제였는데.. 이걸 어떻게 시간안에 풀어야 하는지 막막하다.
풀이에 하루 정도 소요 된것 같다. 조금 막막했어서 검색 찬스를 쓰게되었는데 한두군데만 고쳤으면 정답에 가까웠었다. 내심 뿌듯하기도 하고 아쉽기도 하였다.
너무 오래 붙들고 있는것도 아닌것 같아서 문제에 1~2시간 정도만 생각해보고 안되면 해설을 보고 공부 하도록 마음먹었다.

내가 푼 알고리즘이다.

function solution(s) {
  let arr = [];
  for(let i=1;i<Math.ceil(s.length/2)+1;i++){
    let count =1;
    let sum = '';
    for(let j=0; j<s.length;j+=i){
		let front = s.slice(j,i+j)
    let sliceS= s.slice(i+j) 
    let back = sliceS.slice(0,i)
    if(front===back){
     
      count++
    }else{
      if(count>1){
        sum += count+front;
       
      }else{
        sum+=front
      }
       count=1;
    }
    
    }
    arr.push(sum.length)
  }
  return Math.min.apply(null,arr)
}

slice를 활용하여 문제를 풀었다.

해설을 하자면 문자를 비교하기 위해서 for문을 이용하여 자리수를 늘려가며 글자를 쪼갰다.
앞, 뒤 로 쪼갠뒤 비교를 해줬는데 앞은 기존의 문자열에서 잘라주었고 뒤 부분은 앞에서 자른 문자열에서 다시한번 잘라서 사용하였다.
생각으로 어떻게 잘라야 할지 많이 고민했는데 머리속으로 계산하는것은 확실히 힘들다..
그리고 자른 것을 비교하여 만약에 앞과 뒤가 같으면 count를 증가시킨다.
만약 비교하였을때 다르면 count가 1이상이면 count를 더해준다.
그리고 문자열들을 조합하여 배열에 담고 최솟값을 구해준다.

요약
1. 앞,뒤문자를 짤라서 비교한다
2. 문자를 비교하여 같다면 count수를 증가시키고 다를때 증가시킨 count가 있으면 더해주고 없으면 문자열을 그냥 넣어준다.
3. 배열에 문자를 담고 배열에서 최소길이의 값을 리턴한다.

두가지를 힌트를 써서 배울수 있었다.

  1. Math.ceil(s.length/2)+1
    이부분은 해설을 검색하여 알게 되었다.. 처음에는 s.length를 i 값으로 나눠주었다.
    근데 다 안도는 것 같아서 찾아보니 2로 나눈다.
    문자열의 절반 까지 자를 경우 효과가 있지만 절반 이상으로 자르면 효과가 없기 때문이다.
    예시로 8자리 숫자라면 4/4 절반으로 잘랐을 경우 두개는 비교가 가능하지만
    5/3 이렇게 비교하면 의미가 없다.
    이를 알고 Math.ceil i로 값을 나눠주었고 올림처리하여서 +1 효과를 보려고 했다.
    그런데 문제가 안풀리는게 있어서 +1을 더해주니 문제가 풀렸다...

  2. Math.min.apply(null,arr)
    딱 최솟값을 구하면 Math.min을 쓰면 되구나 했는데 배열에 어떻게 써야 할지 몰랐다.
    null값이 나오길래 이렇게 쓰면 안되구나 싶어서 검색해보니 apply를 쓸수 있다고 배웠다.
    apply에 대해서도 알게 되었다.

조금더 성장해서 이런 문제도 빨리 풀수 있어야 한다.. 화이팅 하자..

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글