택시짱의 개발 노트

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

알고리즘

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

택시짱 2020. 3. 8. 15:58

링크

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

 

코딩테스트 연습 - 문자열 압축 | 프로그래머스

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다. 간단한 예로 aabbaccc의 경우 2a2ba3c(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수

programmers.co.kr

풀이

 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 구하는 문제인데.

 

문자열의 길이가 1000 이하로 정해져 있기 때문에 o(n^2)의 시간 복잡도로 풀리는 문제인걸 알 수 있었다.

 

주어진 문자열 전체를 substr 함수를 이용하여 압축하고자 하는 길이만큼 비교하여 압축을 진행하였고

 

압축이 완성되었을 때 길이를 비교하여 결과를 찾아내었습니다.

 

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#include<string>
#include<set>
#include<map>
#include<cstring>
#include<functional>
#include<cmath>

#define SIZE 1010
const int INF = 2000000000;

using namespace std;

typedef long long int ll;

int solution(string s) {
	int s_size = s.size();

	int res = s_size;
	for (int i = 1; i <= s_size / 2; i++) {
		int word_cnt = 1;
		string tmp = "";
		string left, right;
		int j;
		for ( j = i; j < s_size; j+=i) {
			left = s.substr(j - i, i);
			right = s.substr(j, i);

			if (left == right) {
				word_cnt++;
			}
			else if (left != right) {
				if (word_cnt != 1) {
					tmp += to_string(word_cnt);
				}
				tmp += left;
				word_cnt = 1;
			}
		}
		if (word_cnt != 1) {
			tmp += to_string(word_cnt);
			tmp += left;
		}
		else if (word_cnt == 1) {
			tmp += right;
		}

		res = min(res,(int) tmp.size());
	}
	return res;
}

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	string s; cin >> s;

	cout << solution(s);
}
반응형

'알고리즘' 카테고리의 다른 글

[프로그래머스] 자물쇠와 열쇠  (0) 2020.03.08
[프로그래머스] 괄호 변환  (0) 2020.03.08
[프로그래머스] 등굣길  (0) 2020.03.05
[프로그래머스] 체육복  (0) 2020.03.05
[프로그래머스] 보행자 천국  (0) 2020.02.25
Comments