Jam's story

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

코딩테스트/프로그래머스

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

애플쩀 2022. 7. 13. 07:55
  •  
  • count 변수는 똑같은문자열의 갯수를 세는 변수인데,  문자열을 자르는 동시에 하나가 생기므로 1로 지정 
  • 첫번째 for문은 문자열을 몇개의 문자로 자를건지  ,1개부터 시작 
  • 문자열을 자르는 것은 문자열의 반을 넘을 수 없으니 끝값은 s.length()/2
  • pre 변수에 substring으로 i만큼 자른 문자열을 저장해줌  
  •  두번째 for문은( 연속으로 같아야하니까 )그 다음 비교할 문자열 블럭을 만들기 위함 
  • 그래서 i부터 시작을 했고, 문자열 길이 끝까지 탐색 
  • endIdx는 배열의 인덱스를 넘지않기위해 만든것, ((c+3)이면 넘어가니,, )
  • j인덱스부터 시작해서 i개만큼 더한 인덱스랑,  (substring 두번째 인자에 들어갈꺼니까 -1이되므로)
  • s.length()비교해서 j+i이 더크면 문자열 길이가 들어가도록 
  •  substring에서 인덱스를 넘지않기위해
  • 전에꺼랑 다음 꺼를 비교해서 같다면 count를 올림 
  • 같지않다면 , 2 이상인 경우는 앞에 숫자를 붙여주어야하니 
  •  result에 String형으로 변환하여 count 값을 넣어주는 것을 추가하고 
  • result에  pre값을 넣어준다. 
  • 이제 연속이 안되니까 next가 pre가 되고 count 초기화 
  • 마지막 인덱스일때 한번 더 더해야하므로 넣어주고 
  • 마지막 문자를 붙인다. 
  • answer에는 결과길이와 answer중에 뭐가 더 작은지 비교하고 반환 
class Solution {
    public int solution(String s) {
        int answer = s.length();
        int count = 1;
        for(int i=1; i<=s.length()/2; i++){//[abc][abc][abd][ca] ->2abc.abd.ca 
            String result="";
            String pre= s.substring(0, i); 
            for(int j=i; j<=s.length(); j+=i){
                int endIdx = Math.min(j + i, s.length());  
                String next = s.substring(j, endIdx);
                if(pre.equals(next)){ //[abc][abc]   / [abc][abd] /  [abd][ca]
                    count++; //  2   /  x (2) / x (1)
                } else {
                    if(count >= 2){
                        result+=String.valueOf(count); //2
                    }//if 
                    result+=pre; //2abc
                    pre=next;    
                    count = 1;
                }//else
           
            }//for-j
     
            result+=pre; 
            answer = Math.min(answer, result.length());
             
        }//for-i
        return answer;
    }
}
Comments