관리 메뉴

너와 나의 스토리

[Programmers] 2019 카카오 개발자 겨울 인턴십 - 문자열 압축 본문

Algorithm/브루트 포스 (Brute-Force )

[Programmers] 2019 카카오 개발자 겨울 인턴십 - 문자열 압축

노는게제일좋아! 2020. 5. 4. 20:04
반응형

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

 

 

문제 풀이:

주목할 조건:

  • 앞에서부터 반복되는 문자열이어야 한다.
  • 반복되는 문자열의 길이가 같아야 한다.
  • 반복되는 문자열의 길이가 [10,100) 사이의 숫자이면 길이가 2 증가하고 e.g. 11abc. -> 문자열 길이 5 

 

풀이:

  1. 문자열의 길이를 1부터 n/2가지 늘려가면서 중복 문자열 개수를 카운트
    • 최대한 길게 겹치는 문자는 절반씩 같은 문자 e.g. abcabc
  2. 맨 처음 문자열을 sub라고 두고, 다음부터 보는 문자열을 cnt로 둔다
    • 같으면 cnt++
    • 아니면 지금까지 겹친 문자열 개수 계산한 다음 cnt=0으로 초기화

 

 

 

 

소스 코드:

int solution(string s) {
	int len = s.size();
	int answer = len;

	for (int i = 1; i <= len / 2; i++) {
		string sub= s.substr(0, i);
		int cnt = 0;
		int tmp = 0;
		for (int j = i; j <= len - i; j+=i) {
			string cur = s.substr(j, i);
			if (sub == cur) cnt++;
			else {
				tmp += cnt * i;
				if (cnt == 999) tmp -= 4;
				else if (cnt >= 99)tmp -= 3;
				else if (cnt >= 9)tmp -= 2;
				else if (cnt >= 1) tmp -= 1;
				cnt = 0;
				sub = cur;
			}
		}
		tmp += cnt * i;
		if (cnt == 999) tmp -= 4;
		else if (cnt >= 99)tmp -= 3;
		else if (cnt >= 9)tmp -= 2;
		else if (cnt >= 1) tmp -= 1;
		answer = min(answer, len - tmp);
	} 

	return answer;
}
반응형
Comments