문제 : 카카오 2020 BLINE RECRUITMENT '문자열압축'
구현
예시 5번을 잘 이해하면 쉽게 구현할 수 있는 문제입니다. 문자열의 모든 지점에서 압축크기만큼 압축을 진행할 수 있는게 아니라, 시작지점부터 압축크기만큼 잘라야 합니다.
1 ~ (문자열의길이 / 2) 까지 각각 다 압축을 진행해보고 가장 작은 길이 값을 return 해주면 됩니다.
p1 : 문자열의 현재 시작 지점을 가리키고 있는 포인터
p1 에서부터 i (현재압축크기) 만큼 같은 쌍이 몇개 나오는지 count를 합니다. 이때, count 값이 1이면 자기 자신이랑만 같다는 뜻으로 압축을 할 필요가 없습니다. 따라서, p1 을 p1 + i 로 보내준 후 다시 같은 과정을 반복하면 되고, count 값이 1보다 크다면 압축을 진행할 수 있으므로 압축을 진행하고 p1 을 p1 + count * i 로 보내주면 됩니다.
#include <string>
#include <vector>
#include<algorithm>
using namespace std;
int get_length(int n) {
int ret = 0;
while(n){
ret++;
n /= 10;
}
return ret;
}
int solution(string s) {
int answer = s.length();
int start = 1, end = s.length() / 2;
for (int i = start; i <= end; i++) {
int p1 = 0, tempAns = s.length();
while (p1 <= s.length() - 2 * i) {
// p1 에서부터 i개 씩 같은지 다른지 체크해보자.
int cnt = 0, jump = 0;
while (1) {
bool check1 = false;
for (int j = 0; j < i; j++) {
if (s[p1 + j] != s[p1 + jump + j]){
check1 = true;
break;
}
}
if (!check1) // p1에서부터 i개씩 다 같음 -> p1 + i 로 jump를 이동.
jump += i;
else
break;
cnt++;
}
if (cnt == 1){ // p1에서부터 i개씩 다 같은게 자기 자신 밖에 없음.
p1 += i; // 그러면 p1 시작 위치를 그냥 이동( 압축된게없음 )
}
else{ // p1에서부터 i개씩 다 같은게 있음!
p1 += cnt * i; // 일단 p1을 저 앞으로 이동
tempAns -= i * cnt; // 답 갱신
tempAns += get_length(cnt) + i;
}
}
answer = min(answer, tempAns);
}
return answer;
}
'Problem Solving > Programmers' 카테고리의 다른 글
[Programmers] 자물쇠와 열쇠 - travelbeeee (0) | 2020.04.16 |
---|---|
[Programmers] 괄호 변환 - travelbeeee (0) | 2020.04.15 |
[Programmers] [3차] n진수 게임 - travelbeeee (0) | 2020.04.13 |
[Programmers] 기능개발 - travelbeeee (0) | 2020.03.16 |
[Programmers] 2 x n 타일링 - travelbeeee (0) | 2020.03.16 |