본문 바로가기
카테고리 없음

알고리즘(문자열 압축, 큰 수 만들기)

by uyoo 2020. 4. 10.

[문자열 압축]

 

* 로직

  • 단어의 비교 묶음을 1개부터 (문자열 길이/2)개까지 늘려가면서 압축을 진행한다
  • 이전과 같은 문자라면 카운팅을 진행해주고, 그렇지 않다면 이전까지 카운팅된 수에 맞게끔 압축을 진행한다
    • 카운팅된 수가 1개라면 1을 생략한다
    • 2개 이상이라면 숫자를 넣어준다
  • (문자열의 길이 / 단어의 비교 묶음)이 홀수라면
    • 문자열의 뒷부분이 고려가 안되기 때문에 따로 남은 부분을 압축된 문자열 뒤에 붙여준다
  • 압축된 문자열을 받게되면 해당 문자열의 길이를 세고, 최솟값으로 갱신한다

 

class Solution {
    public int solution(String s) {
        int answer = Integer.MAX_VALUE;
        if(s.length() == 1) return 1;

        //단어의 묶음을 1개부터 문자의 길이/2까지 나눠서 진행
        for(int i=1; i<=s.length()/2; ++i){
            int idx=0;
            int cnt=1;
            String base = s.substring(idx, idx+=i);
            StringBuilder sb = new StringBuilder("");

            boolean check = false;
            for(int j=1; j<s.length()/i; ++j) {
                check = true;
                String word = s.substring(idx, idx+=i);
                if(base.equals(word)){
                    cnt++;
                }

                else {
                    doCompression(base, cnt, sb);
                    cnt=1;
                    base = word;
                }

                //끝 단어까지 붙여줘야함
                if(j == s.length()/i - 1) doCompression(base, cnt, sb);
            }

            //묶음으로 나눌 때 홀수개로 끊긴다면 -> 뒤에 남은 부분 붙여주기
            if(check && s.length() % i != 0) {
                sb.append(s.substring(idx, s.length()));
            }
            answer = Math.min(answer, getWordLength(sb));
        }

        return answer;
    }
    
    private static int getWordLength(StringBuilder sb) {
        return sb.length();
    }

    private static void doCompression(String base, int cnt, StringBuilder sb) {
        if(cnt <= 1) {
            sb.append(base);
        }

        else {
            sb.append(cnt);
            sb.append(base);
        }
    }
}

 

[큰 수 만들기]

 

* 로직

  • number의 길이 - k는 구하고자 하는 답의 자리수이다
  • 그렇다면 구하고자 하는 자리수의 왼쪽부터 마지막 일의 자리 수까지 가장 큰 수를 채워나간다
  • 자리수를 하나씩 옮길때마다 가장 큰 수를 찾은 index의 다음 부분부터 그 다음 탐색을 진행한다

 

class Solution {
    public String solution(String number, int k) {
        String answer = "";
        int size = number.length() -  k;

        int idx=0;	//자리수마다 큰 수를 찾은 인덱스
        StringBuilder sb = new StringBuilder();
        
        //찾고자 하는 자리수의 왼쪽부터 마지막 일의 자리까지
        for(int i=size; i>=1; --i) {
            int max = 0;
            for(int j=idx; j<number.length()-i+1; ++j) {
                if(max < number.charAt(j) - '0') {
                    max = number.charAt(j) - '0';
                    idx = j+1;
                }
            }
            sb.append(max);
        }

        return answer = sb.toString();
    }
}