본문 바로가기

CS/Algorithm

카카오 문자열 압축 문제

반응형

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

 

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

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

programmers.co.kr

 

레벨 2인데 생각보다 어려웠다.

문제 자체가 잘 이해가 안가더라.

aabbaccc 예제를 2a2ba2cc이지 왜 2a2ba3c냐고 속으로 엄청 화냈음ㅋㅋㅋ

근데 자세히 보니까 스플릿 기준 1이어서 2a2ba3c가 되는거더라

그리고 앞에 앞에 숫자를 넣는것보다 뒤에 숫자를 넣는게 += 할 때 더 좋을것이라 판단했다.

package question;

import java.util.HashMap;
import java.util.Iterator;

public class 카카오_문자열_압축
{
    // aabbcaabb

    public static void main(String [] args)
    {
        HashMap<String, Integer> testData = new HashMap<>();
        // 2a2bac2c
        // ac2c
        testData.put("aabbaccc", 7);
        testData.put("ababcdcdababcdcd", 9);
        testData.put("abcabcdede", 8);
        testData.put("abcabcabcabcdededededede", 14);
        testData.put("xababcdcdababcdcd", 17);


        Iterator iterator = testData.keySet().iterator();
        while (iterator.hasNext())
        {
            String key = (String)iterator.next();
            System.out.println(key + ":" + ((solution(key) == testData.get(key)) ? "성공" : "실패") );
        }
    }

    static int solution(String s)
    {
        if (s.length() == 1)
            return 1;

        int resultCount = 1000;
        for (int i = 1; i < (s.length() / 2) + 1; i++)
        {
            String result = "";
            String prev = "";
            int count = 1;
            for(int j = 0; j < (s.length() / i) + 1; j++)
            {
                int start = j * i;
                int end = start+i;
                if (end > s.length())
                {
                    end = s.length();
                }

                String current = s.substring(start, end);
                if (prev.equals(current) && !prev.equals(""))
                {
                    count++;
                    continue;
                }
                prev = current;
                result += parseString(count, prev);
                count = 1;
            }
            System.out.println(i + "묶음 : " + result);
            if (resultCount > result.length())
            {
                resultCount = result.length();
            }

        }
        return resultCount;
    }

    static String parseString(int count, String str)
    {
        if (count <= 1)
        {
            return str;
        }
        return count+str;
    }
}

 

반응형

'CS > Algorithm' 카테고리의 다른 글

124 나라  (0) 2021.05.13
다트 게임  (0) 2021.05.11
로또의 최고 순위와 최저 순위  (0) 2021.05.04
모의고사  (0) 2021.05.04
키패드 누르기  (0) 2021.05.04