문자열 압축

최준호·2021년 8월 4일
0

알고리즘 강의

목록 보기
7/79

설명

알파벳 대문자로 이루어진 문자열을 입력받아 같은 문자가 연속으로 반복되는 경우 반복되는

문자 바로 오른쪽에 반복 횟수를 표기하는 방법으로 문자열을 압축하는 프로그램을 작성하시오.

단 반복횟수가 1인 경우 생략합니다.

코드

public class Compression {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        //String input = in.next();
        String input = "KSTTTSEEKFKKKDJJGG";
        solution2(input);
    }
    //while을 이용한 풀이
    public static void solution(String input){
        char p = '가';
        StringBuilder sb = new StringBuilder();

        char[] chars = input.toCharArray();
        for(int i=0; i<chars.length; i++){
            int idx = 1;
            char c = chars[i];
            if(p!=c){
                p = c;
                sb.append(c);
            }else{
                while(i<=chars.length){
                    idx++;
                    i++;
                    if(i>=chars.length){
                        i--;
                        break;
                    }
                    char d = chars[i];

                    if(p!=d){
                        i--;
                        break;
                    }
                }
                sb.append(idx);
            }
        }
        System.out.println(sb.toString());
    }
    
    //문자열에 마지막 공백을 추가하는 방법
    public static void solution2(String input){
        input = input+" ";
        StringBuilder sb = new StringBuilder();
        int idx = 1;

        char[] chars = input.toCharArray();
        for(int i=0; i<chars.length-1; i++){
            char c1 = chars[i];
            char c2 = chars[i+1];
            if(c1==c2) idx++;
            else{
                sb.append(c1);
                if(idx>1)sb.append(idx);
                idx = 1;
            }
        }
        System.out.println(sb.toString());
    }
}

2가지 풀이로 풀었는데

  1. while을 사용하는 방법
  2. 직접 탐색 방법

1번은 내가 생각했던 방식이다. 너무 어이가 없는 방식이긴 하다. 문자열 탐색하려고 이중 포문을 돌려야한다니... 내가 풀면서도 이건 아닌거 같았다.

2번은 강의에 나온 내용인데. 내가 1번을 풀면서 아 이렇게 말고 배열의 전까지 돌려서 값을 낼수 있지 않을까? 싶어서 풀어보다가 포기했었다. 그 이유는 마지막 배열에 대한 처리를 어떻게 해야할지 모르겠어였었다. 근데 강의를 보니 똑같은 내용에 맨 뒤에 " " 공백 하나를 더 주어서 배열의 크기 자체를 늘렸더라... 진짜 대단하다... 저런 생각은 문제를 풀면서 늘려야할거 같다.

마지막 배열을 탐색하기 어렵다면 마지막 배열을 임의로 추가해서 해결하자!

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글