https://programmers.co.kr/learn/courses/30/lessons/60057
문제 풀이
간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다.
문자열 압축하기
주어진 문자열을 스캔하면서 고려해야 하는 조건이 첫번째는 substr 하려는 범위가 주어진 문자열의 범위를 넘어서면 안된다는 것이다. 두번째는 substr 범위가 주어진 문자열의 범위를 넘어선 경우 압축된 문자열에 그대로 추가해줘야 한다는 것이다.
int divideString(int length, string s) { string zipString = ""; int i = 0;
for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { int count = 0; bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length);
while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); }
if (isErase == true) { i -= length; }
if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } }
for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; }
return zipString.length(); }
|
문제 전체 소스
#include <bits/stdc++.h> using namespace std;
int divideString(int length, string s) { string zipString = ""; int count = 0; int i = 0;
for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length);
while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); }
if (isErase == true) { i -= length; }
if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } count = 0; cmpstr = ""; }
for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; }
return zipString.length(); }
int solution(string s) { int answer = 0; int minValue = s.length(); for (int i = 1; i <= s.length() / 2; i++) { int zipLength = divideString(i, s); minValue = min(zipLength, minValue); } answer = minValue;
return answer; }
|