Algorithm

[Programmers] 문자열 압축

프로그래민 2020. 8. 12. 00:48
반응형

문자열을 파싱하는 문제이다.

주어진 조건대로 단순히 문자열을 파싱해주는 문제이다. 일단 봐야하는 문자열 길이를 1부터 전체길이/2 를 해주었고, keep이라는 변수를 통해 현재까지 같은 누적을 계산하여 문자열의 길이를 구해주었다. 단순 구현 시뮬레이션 문제이므로 조건을 꼼꼼히 읽는 것이 중요한 문제였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package programmers;
 
public class Solution_2020카카오_문자열압축 {
    public static void main(String[] args) {
//        String s="aabbaccc";
        String s="ababcdcdababcdcd";
//        String s="abcabcdede";
//        String s="abcabcabcabcdededededede";
//        String s="xababcdcdababcdcd";
        
        System.out.println(solution(s));
    }
    
    static int solution(String s) {
        int result= s.length();
        
        
        for(int len=1; len<=s.length()/2;len++) {    //전체길이의 절반까지만 확인
            
            int temp=s.length()%len;        //맨마지막에 안도는 것들 일단 더해주기
            String cur = null,next=null;
            int keep=1;                //현재 카운트 갯수
            for(int start=0;start<=s.length()-len;start+=len) {    //시작점 설정
                if(start==0) {        
                    cur=s.substring(start,start+len);        //첫번째
                }else {
                    next=s.substring(start,start+len);
                    if(cur.equals(next)) {        //같은 문자열일때 카운트 추가
                        keep+=1;    
                    }else {                        //다른 문자열일때
                        if(keep!=1) {            //누적이 하나가 아니면
                            temp+=len+ calc(keep);
                        }else {            
                            temp+=len;            //누적이 하나면
                        }
                        cur=next;
                        keep=1;
                    }
                }
            }
            if(keep!=1) {
                temp+=len+calc(keep);
            }else {
                temp+=len;
            }
            cur=next;
            keep=1;
            
            result=Math.min(temp, result);
        }
        
        return result;
    }
    
    static int calc(int keep) {
        int result=0;
        while(keep!=0) {
            keep/=10;
            result++;
        }
        return result;
    }
}
 
                                     
반응형

'Algorithm' 카테고리의 다른 글

[Programmers] 길 찾기 게임  (0) 2020.08.16
[BOJ] 9466. 텀 프로젝트  (4) 2020.08.15
[BOJ] 2644. 촌수계산  (0) 2020.08.11
[BOJ] 1931. 회의실배정  (0) 2020.08.08
[Programmers] 추석 트래픽  (0) 2020.08.07