Algorithm/이코테

9.문자열 압축

마닐라 2021. 12. 11. 16:03

📍 문제 설명

 

💡 접근

x개로 잘랐을 때의 문자열을 잘 넣어주긴 했는데 마지막 배열의 문자열의 처리와 정확히 x개로 잘리지 않았을때 남는 문자열에 대한 처리에 대해서 좀 많이 고민했다.

빈칸을 하나넣어줘서는 1개로 잘랐을 때의 마지막 문자열 처리밖에 되지 않아서 마지막 배열일 때 cnt 값에 따라 문자열이 더해질 수 있도록 했고 정확히 x개로 잘리지 않았을 때는 자른 문자열 subStr 변수에 그대로 남아있을테니 모든 처리 후 마지막에 해당 문자열을 넣어줘서 처리했다.

 

👩‍💻 코드

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);

        String s = kb.nextLine();

        //압축되지않을 땐 그 문자열의 길이로 한다.
        int answer = s.length();
        //s = 5 or 6
        //1개 단위로 잘라 압축했을 때
        //2개 단위로 잘라 압축했을 때
        //s.length/2개 단위로 잘라 압축했을 때까지 확인(홀수개의 문자열이어도 해당함)

        //문자열 하나 가지고 판단한다.
        //i == i + 1 일 때는 count++
        //i != i + 1 일 때는 출력하는데 count가 1이 아니면 앞에 출력하고 i번째 문자열 출력
        //이런식으로 i = s.length - 1 까지 탐색

        //문자열 두개 가지고 판단한다.
        //두 개를 하나의 인덱스로 하는 배열을 만들고(크기는 2, 3) s.length/2 - 1 (1번 or 2번 탐색한다) aabbc aabbcc
        //어디까지? -> s.length/2 - 1 까지 탐색 2.5,3

        //문자열 세개 가지고 판단한다.
        //세 개를 하나의 인덱스로 하는 배열을 만들고(크기는 1, 2) s.length/3 - 1 (0번 or 1번 탐색한다)
        //어디까지? -> s.length/3 - 1 까지 탐색 1.67, 2

        //x개 단위로 잘라 압축했을 때
        for(int i = 1; i <= s.length()/2; i++) {
            //자른 문자열 저장
            String subStr = s;
            //새로운 문자열 저장
            String newStr = "";
            //문자열 압축 횟수 저장
            int cnt = 1;

            //문자열 x개를 하나의 인덱스로 하는 배열을 만든다.
            String[] arr = new String[s.length()/i]; //5 2 1
            //저 배열 안에다가 자른 문자열들을 넣는다.
            //i = 1   0-0,1 1-1,2 2-2,3 3-3,4 4-4,5
            //i = 2   0-0,2 1-2,4
            //i = 3   0-0,3

            for(int j = 0; j < arr.length; j++) {
                //i개 만큼 문자열자르기
                arr[j] = subStr.substring(0, i);

                //원본 문자열은 건들지 말아야 다음 단위에서 쓸 수 있다.
                //i개 이후로 문자열을 다시 저장
                subStr = subStr.substring(i);
            }

            //저장된 배열을 돌려서 압축 가능한지 확인한다.
            for(int k = 0; k < arr.length-1; k++) {
                //압축 가능하면
                if(arr[k].equals(arr[k+1])) {
                    cnt++;
                }
                else {
                    //같지않으면 앞에서 반복된 변수인지 확인
                    if(cnt > 1) {
                        newStr += cnt + arr[k];
                        cnt = 1;
                    }
                    else newStr += arr[k];
                }
                //마지막 배열의 문자열 처리해줘야해
                if(k+1 == arr.length-1) {
                    if(cnt > 1) newStr += cnt + arr[k+1];
                    else newStr += arr[k+1];
                    cnt = 1;
                }
            }
            //그리고 substr에 남아있는 문자열은 더해줘야함
            if(subStr != "") newStr += subStr;
            answer = Math.min(answer, newStr.length());
        }

        System.out.println(answer);

    }
}

'Algorithm > 이코테' 카테고리의 다른 글

11.뱀  (0) 2022.01.06
10.자물쇠와 열쇠  (0) 2021.12.11
8.문자열 재정렬  (0) 2021.12.11
7.럭키 스트레이트  (0) 2021.12.11
6.무지의 먹방 라이브  (0) 2021.12.10