본문 바로가기
코딩테스트 공부/Programmers

[C++] level2 문자열 압축 50067

by 메정 2021. 8. 21.

참고자료
해당 문제는 구글링을 통해 해결했으므로 상단에 참고한 사이트를 첨부한다.
https://dokylee.tistory.com/81

📌문자열 압축

/*문제 설명은 생략한다. 링크 통해 문제로 갈 수 있음!*/

📌풀이

to_string(cnt).size()

return 값이 문자열의 길이이므로 자른 문자열은 별도로 저장할 필요 없이 size만 더해준다.

이 문제는 for문을 돌면서 주어진 s의 사이즈 만큼 돌면서 문자열을 자르고,
그 안에서 이전 단위 문자열과 새로 잘린 문자열을 비교하면서
같으면 중복 횟수를 증가, 다르면 카운트를 문자열로 변환 후 그 문자열의 자리수를 answer에 더해준다.
새로 잘린 문자열의 길이도 answer에 더해주고, 중복 횟수를 1로 초기화한다.

주의 할 점
마지막으로 잘린 문자열이 이전과 같은 경우, 중복 횟수만 증가하고 answer에는 더해지지 않음
-> 중복 횟수 != 1인 경우, 문자열로 변환하여 해당 수를 answer에 더해줘야 한다.

📌코드

#include <string>
#include <vector>

using namespace std;

int solution(string s)
{
    int answer = 100000; //세팅

    if (s.size() == 1)
        return 1; //예외처리

    //i단위로 문자열을 자름
    for (int i = 1; i < s.size(); i++)
    {
        //cnt는 중복 횟수, result는 문자열 길이
        int cnt = 1, result = 0;
        string before = "", current = "";

        //j는 잘린 단위의 시작 인덱스
        for (int j = 0; j < s.size(); j += i)
        {
            current = s.substr(j, i);

            //이전 문자열과 비교
            if (before == current)
                cnt++;
            else
            {
                //길이만 구하면 되니까 잘린 현재 문자열.size()를 reuslt에 더해줌
                if (cnt == 1)
                    result += current.size();
                else
                    result += (to_string(cnt).size() + current.size());
                cnt = 1; //다시 초기화
            }
            before = current; //이전값 현재로 초기화
        }
        //마지막 문자열이 이전 문자열과 같은 경우
        if (cnt != 1)
            result += to_string(cnt).size();

        if (answer > result)
            answer = result;
    }
    return answer;
}

회고

문자열을 자른 후 이전 단위 스트링과 새로 잘린 스트링을 비교하는 것까지는 알았는데 이상하게 값이 잘 안나와서 구글링했다.

나의 문제는 다음과 같다.

  • 마지막 반복자를 고려하지 않은 점... ㅎㅎ....
  • 나의 경우 문자열을 구해서 중복횟수+문자열 이런 식으로 새 temp라는 문자열에 더해주고, 마지막에 temp.size()를 return
    • 이 방법으로 푸는 것은 문제는 안되지만, 예외 상황을 고려하지 못한 점이 나의 문제....

아직도 일차원적으로만 고민하는게 나의 코테 풀이 문제 중 하나인 것 같다.

댓글