1 분 소요

문제1

문제2

코드의 작동원리 설명문자열 압축 설명

import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int solution(String s) 
    {
        //s ="aabbaccc"
        int answer = 0;   
       
        //문자열 길이가 홀수, 짝수 무관하게 반절까지만 하면 된다.
        int maxnum = (s.length()==1) ? 1 : s.length()/2;
        
        //전체 문자열의 길이
        int max;
        
        //압축에 의해 줄어들 문자열의 길이
        int minus;
        
        //압축된 문자열의 개수 표시로 인해 증가한 길이
        int incre; 
        
        //문자열을 일정하게 나누었을 때의 몫
        int quo;

        //나뉜 부분이 반복되는 횟수
        int cont_num;

        //연속된 여부 판별
        boolean consec;    

        String former;
        String latter;   
        
        ArrayList<Integer> common_factor = new ArrayList<Integer>();                
        for(int i=1; i<=maxnum; i++)
        {
            common_factor.add(i);
        }
        /*위의 반복문 실행결과
            common_factor = [1,2,3,4]        
        */
        //여기까지는 정상적으로 동작되는거 확인했다.
 
        //각각의 단위로 짤랐을 때 문자열의 길이를 저장할 어레이 리스트
        ArrayList<Integer> num = new ArrayList<Integer>();

         for(int j : common_factor)
         {
             max = s.length();
             minus = 0;
             quo = s.length() / j;
             cont_num = 1;
             consec = false;    
             
             former ="";
             latter ="";

            if(quo > 1)
            {        
                 for(int k = 0; k<(quo-1) * j; k=k+j)
                 {
                     former = s.substring(k, k+j);                 
                     latter = s.substring(k+j, k+2*j);

                     //자른 문자열의 뒤가 앞의 것과 같은 경우
                     if(latter.equals(former))
                     {
                        cont_num +=1;

                        /*latter가 맨 마지막인지 물어보는 if문
                        (꼭 필요하다, 아래 조건문이 없다면,
                        맨 뒤부분이 그 이전의것과 반복될 경우,
                        문자열 압축이 되지 않는다.)
                        */
                        if(k+2*j == quo * j)
                        {
                           //반복횟수 표시에 따른 증가된 문자열 길이
                           incre = 0;
                           while(cont_num !=0)
                           {
                               cont_num = cont_num/10;
                               incre +=1;
                           }
                           minus -=(j-incre); 
                        } 
                        else
                        {
                           minus -=j; 
                        }
                        consec = true;
                     }

                     //자른 문자열의 뒤가 앞의 것과 다르나
                     //이전의 문자열과 그 앞의 것이 연속될 경우
                     else if(consec)
                     {
                           incre = 0;
                           while(cont_num !=0)
                           {
                               cont_num = cont_num/10;
                               incre +=1;
                           }
                         cont_num =1;
                         minus += incre;
                         consec = false;
                     }                  
                 }  
            }
             num.add(max + minus);
         }       
        answer = Collections.min(num);
        return answer;
    }
}

실행결과정답화면

댓글남기기