문자열 압축

108번뇌·2021년 7월 17일
0

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

이문제 태스트 케이스 30/29인데 나머지 하나 뭐가 문제인지 모르겠다.
답지위주로 똑같게 맞춰봐도 모르겠다.

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(string s) {
	int answer = s.size();
	string sTemp = s.substr(8, 100);
	for (int i = 1; i <= (s.size() / 2); i++)
	{

		string sResult = "";
		string sTemp = s.substr(0, i);//멘처음 만큼 자른다.
		int iCnt(1);
		for (int j = i; j <= s.size(); j += i)//i만큼씩 더한다.
		{
			if (sTemp == s.substr(j, i))      iCnt++;
			else
			{
				if (iCnt == 1)    sResult += sTemp;
				else
				{
					sResult = sResult + to_string(iCnt) + sTemp;
					iCnt = 1;
				}
				sTemp = s.substr(j, i);
			}
		}

		if (s.size() % i != 0)
		{
			int iStart = (s.size() / i)*i;
			sResult += s.substr(iStart);
		}
		answer = min((int)sResult.size(), answer);
	}
	return answer;
}

int main()
{
	string s = "ababcdcdababcdcd";
	string sasda = s.substr(5);
	//string sTemp = s.substr(100, 2);
	
	int iTeml = solution(s);

}

답지소스

#include <string>
#include <vector>
using namespace std;
 
int solution(string s) {
    int len = s.size();
    int answer = len;
 
    int n = len / 2;
 
 
    //i개 단위로 잘라서 압축
    for (int i = 1; i <= n; i++) {
 
        //i개 단위로 잘라서 압축한뒤 만들어지는 문자열
        string result = "";
 
        //자를 문자열 단위
        string ss = s.substr(0, i);
 
        int cnt = 1;
 
        //앞에서 자른 문자열 단위를 제외한 뒷부분(j번 문자부터) 문자열을 검사한다.
        for (int j = i; j <= len; j += i) {
            //j번 부터 i개 만큼이 문자열 단위와 똑같은 경우 cnt 증가
            if (ss == s.substr(j, i)) {
                cnt += 1;
            }
            else {
                //다른 경우 중 cnt가 1이면 result에 그대로 ss를 붙인다.
                if (cnt == 1) {
                    result += ss;
                }
                else {
                    //cnt가 1보다 크다면 cnt를 문자열 단위 앞에 붙여서 result에 이어준다.
                    result += (to_string(cnt) + ss);
                }
 
                //문자열 단위를 j번부터 i개로 변경 
                ss = s.substr(j, i);
                //cnt값 다시 1로 초기화
                cnt = 1;
            }
 
        }
 
        //문자열이 i로 나누어 떨어지지 않는다면 result에 나머지 부분을 붙여줘야한다.
        if ((len%i) != 0) {
            result += s.substr((len / i)*i);
        }
 
        //최솟값을 answer에 저장
        if (answer > result.size()) answer = result.size();
    }
 
 
    return answer;
}

중요한건.
1. string sTemp = s.substr(8, 100);
s의 사이즈가 8일때 8부터 하면 sTemp =""가 되서 저절로 마지막 문자열 처리가 된다.
s.substr(9,100);을 하면 런타임 에러난다.

2.또한 s.substr(6);이런식으로 쓰면 6번째부터 나머지 문자열들 다 짜른 결과물이 나오게 된다.

  1. 2를 통해서 for (int j = i; j <= len; j += i) {같은 루프를 돌릴 수 있다.
    len == 이 되는 순간 나머지는 알아서 ="";처리되는 방식 이해하는게 중요하다.
    <인경우는 밑에서 나머지 0이 아닐때의 경우를 따르게 된다.

내가 취약한 문자열 다루기 방식.

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글