참고자료
해당 문제는 구글링을 통해 해결했으므로 상단에 참고한 사이트를 첨부한다.
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;
}
회고
문자열을 자른 후 이전 단위 스트링과 새로 잘린 스트링을 비교하는 것까지는 알았는데 이상하게 값이 잘 안나와서 구글링했다.
나의 문제는 다음과 같다.
아직도 일차원적으로만 고민하는게 나의 코테 풀이 문제 중 하나인 것 같다.