Algorithm/Programmers

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

ikjo 2022. 4. 25. 23:10

문제 설명

 

 

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

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

programmers.co.kr

 

접근 방법

  1. (1 단위로 압축 시) 문자열의 첫번째 문자를 가지고 두번째, 세번째 등 각각의 문자를 순서대로 비교하면서 일치하는지 여부를 검사합니다.
  2. (1번 검사 작업에 대해) 일치하는 경우 multiple 변수(초기값 1)의 값을 1씩 증가시킵니다.
  3. (1번 검사 작업에 대해) 일치하지 않는 경우 별도의 압축 문자열(zipString) 변수에 multiple 값(문자열 형태로)과 첫번째 문자를 추가 할당해줍니다.
  4. 이후 두번째 문자를 가지고 세번째, 네번째 등 각각의 문자를 순서대로 비교하면서 2~3번 작업을 반복합니다.
  5. 모든 문자를 비교했을 경우 2 단위로 압축하여 1~4번 작업을 반복합니다.

 

 

 

전체 소스 코드

class Solution {
    public int solution(String s) {
        int lengthOfString = s.length();
        if (lengthOfString == 1) {
            return 1;
        }

        StringBuilder zipString = new StringBuilder();
        int result = 1000, multiple = 1, unit = 1, nextIndex = unit;
        String currentString, nextString;

        while (nextIndex + unit <= lengthOfString) {
            currentString = s.substring(0, unit);
            nextString = s.substring(nextIndex, nextIndex + unit);

            while (nextIndex + unit <= lengthOfString - 1
                && nextIndex + unit * 2 <= lengthOfString) {
                if (currentString.equals(nextString)) {
                    multiple++;
                } else {
                    if (multiple == 1) {
                        zipString.append(currentString);
                    } else {
                        zipString.append(multiple).append(currentString);
                        multiple = 1;
                    }
                }

                currentString = s.substring(nextIndex, nextIndex + unit);
                nextIndex += unit;
                nextString = s.substring(nextIndex, nextIndex + unit);
            }

            if (currentString.equals(nextString)) {
                multiple++;
                nextIndex += unit;
            }

            if (multiple == 1) {
                zipString.append(currentString);
            } else {
                zipString.append(multiple).append(currentString);
            }

            zipString.append(s.substring(nextIndex));

            result = Math.min(result, zipString.length());
            multiple = 1;
            unit++;
            nextIndex = unit;
            zipString.setLength(0);
        }

        return result;
    }
}

 

 

참고자료