IT recording...

[PG] 문자열 압축 - Java 본문

Algorithm

[PG] 문자열 압축 - Java

I-one 2022. 4. 20. 00:59

https://programmers.co.kr/learn/courses/30/lessons/60057

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문

programmers.co.kr

[풀이]

마지막 예제에서 xababcdcdababcdcd 의 경우 맨 앞에서부터 잘라야 한다는 것을 보지 않아서 삽질했다.

x다음부터는 비교를 할 수가 없고, 항상 맨 처음부터 비교해야 함

 

1. 1개 단위로 자를 때, 2개 단위로 자를 때, ... 를 모두 실행한 후 압축한 문자열의 길이를 비교한다.

2. 몇 개 단위까지 자를 수 있을까? => 문자열의 길이(L)/2 까지 자를 수 있다.

   ex) 문자열 길이 7이면 7/2 = 3 , 3까지 자를 수 있음. 4는 어차피 안됨 (4+4는 8이라서 길이 벗어나니까)

3. substring 함수를 사용해서 while문으로 문자열의 끝까지 비교한다. (k++하면서)

   문자열을 벗어나면 break

   3-1. 두 문자열이 같으면 count++; 다르면 zip문자열에 해당 문자열을 더한다. (1이면 그냥 더하고, 1초과면 숫자를 더해서 더함)

4. cash는 while문을 빠져나왔을 때 끝까지 다 갔는지를 확인하기 위함이다. 

   cash == L이면 zipLength에 더해 줄 필요 없고, 다른 경우에는  L%i를 더해준다. 

5. answer 최소 비교하고, 최소 리턴

 

[코드]

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 1000;
        int L = s.length();
        for(int i=1;i<=L/2;i++){ //i : 자르는 단위
            String zip = "";
            int zipLength = 0;

            int k=1;
            int count=1;
            int cash = 0;
            String box1 = "";
            String box2 = "";
            while(true){
                if(i*(k+1)<=L){
                    box1 = s.substring(i*(k-1),i*k);
                    box2 = s.substring(i*k,i*(k+1));

                    if(box1.equals(box2)){
                        count++;
                    }
                    else{
                        if(count==1){
                            zip += box1;
                        }
                        else{
                            zip += count+box1;
                        }
                        count=1;
                    }
                    cash = i*(k+1);
                    k++;
                }
                else{
                    break;
                }
            }
            
            if(count==1){ //마지막꺼 처리
                zip += box2;
            }
            else{
                zip += count+box1;
            }
            
            if(cash!=L){
                zipLength += (L%i==0)?(i):(L%i); //딱 맞게 끝난 애가 아니면 짜투리 추가하기    
            }

            zipLength += zip.length();
            answer = Math.min(answer,zipLength);
        }
        
        if(answer == 1000){ //한 번도 비교 안한 애면 길이가 1인 애
            answer = 1;
        }
        return answer;
    }
}

[느낀점]

소요시간 : 3h

왜이렇게 어렵지? 문자열 너무 어렵네.. 

문자열 대비를 좀 더 해야겠다

substring(start,end)도 오랜만에 본 느낌

'Algorithm' 카테고리의 다른 글

[BOJ] 16235 나무재테크 - Java  (0) 2022.04.21
[BOJ] 16234 인구이동 - Java  (0) 2022.04.21
[BOJ] 15685 드래곤커브 - Java  (0) 2022.04.19
[BOJ] 2667 단지번호붙이기 - Java  (0) 2022.04.16
[BOJ] 15684 사다리조작 - Java  (0) 2022.04.16
Comments