참고자료
해당 문제는 구글링을 통해 해결했으므로 상단에 참고한 사이트를 첨부한다.
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
- 이 방법으로 푸는 것은 문제는 안되지만, 예외 상황을 고려하지 못한 점이 나의 문제....
아직도 일차원적으로만 고민하는게 나의 코테 풀이 문제 중 하나인 것 같다.
'코딩테스트 공부 > Programmers' 카테고리의 다른 글
[C++] level2 뉴스 클러스터링 17677 (0) | 2021.08.21 |
---|---|
[C++] level1 비밀지도 50067 (0) | 2021.08.21 |
[C++] level2 2개 이하로 다른 비트 77885 (0) | 2021.08.21 |
[C++] level2 게임 맵 최단거리 1844 (0) | 2021.08.21 |
[C++] level2 카카오프렌즈 컬러링북 1829 (0) | 2021.08.21 |
댓글