본문 바로가기

problem solving

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

1에서부터 s.size() / 2까지의 길이를 기준으로 가장 짧게 될 수 있는 압축 사이즈를 구했다.

정확히 단위마다 끊어져야 하므로 첫 for문에서 +sec(단위)씩 증가하도록 했다.

여기서  같은 쌍을 가질 수 있는 한계인 i < s.size() - (2 * sec) + 1을 기준으로

정해진 한계를 넘어가면 남아있는 문자열 길이를 전부 카운트에 넣고 반복문을 종료하고

한계를 넘어서지 않았다면 sec(단위)  만큼 카운트에 넣어준다.

이후 while문을 순회하는데 같은 단어가 반복되면 뛰어넘도록 함수를 구성해준다.

while문을 진행하면서 같은 쌍의 개수를 세기 위해 check++을 한다.

1 ~ 9 일수도 10 ~ 99 일수도 100 ~ 500 일수도 있기 때문에 check로 구한 수를

while문이 끝난 후 카운트에 자리수만큼 추가해준다.

위의 행동을 반복하다보면 답이 구해진다.

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
#include <string>
#include <vector>
 
using namespace std;
 
int solution(string s) {
    int answer = 0;
    
    int min = s.size();
    int sec = 1;
    int j = 0;
    vector<string> val;
    while(sec <= s.size() / 2) {
        int count = 0;
        
        for(int i = 0; i < s.size(); i+=sec) {
            int flag = 0;
            if (i < s.size() - (2 * sec) + 1) {
                count += sec + 1;
            }
            else {
                count += s.size() - i;
                break;
            }
            
            int check = 0;
            while (true) {
                check++;
                for(j = i; j < i + sec; j++) {
                    if(s[j] != s[j + sec]) { break; } 
                }
                
                if(j == i + sec) { 
                    i = j; 
                    flag = 1;
                }
                else {
                    if(!flag) { count -= 1; }
                    break;
                }
            }
            while (check > 1) { 
                count++;
                check /= 10;
            }
        }
        min = min > count ? count : min;
        sec++;
    }
    
    answer = min;
    return answer;
}
cs

'problem solving' 카테고리의 다른 글

[프로그래머스]조이스틱  (0) 2020.03.08
[프로그래머스]컬러링북  (0) 2020.03.08
[프로그래머스]프린터  (0) 2020.03.07
[프로그래머스]주식가격  (0) 2020.03.07
[프로그래머스]쇠막대기  (0) 2020.03.07