코딩테스트 연습 - 문자열 압축 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

코드
#include <string>
using namespace std;
int solution(string s) {
string cnt_s;
int sum, check, cnt, a, size = 1, answer = s.length();
while (size <= s.length() / 2) {
sum = s.length();
check = 0;
cnt = 1;
a = s.length() - size - s.length() % size;
for (int i = 0; i < a; i += size) {
if (s.substr(i, size) == s.substr(i + size, size)) {
sum -= size;
cnt++;
if (check == 0)
check = 1;
}
else {
check = 0;
if (cnt > 1) {
cnt_s = to_string(cnt);
sum += cnt_s.size();
}
cnt = 1;
}
}
if (cnt > 1) {
cnt_s = to_string(cnt);
sum += cnt_s.size();
}
if (sum < answer)
answer = sum;
size++;
}
return answer;
}
풀이
1. 문자열을 자르고자 하는 단위가 size일 때, 무조건 s[0]부터 size만큼 잘라야 한다.
2. 1과 같은 이유로 부분 문자열을 잘라 비교할 때에 인덱스를 무조건 size만큼 증가시켜야 한다.
3. 부분 문자열이 반복된다면 sum=s.length()에서 size만큼 빼준다.
4. check라는 변수를 활용해 부분 문자열이 계속 반복되는지 확인한다.
5. cnt라는 변수를 활용해 부분 문자열이 몇 번 반복되는지 확인한다.
6. 부분 문자열 반복이 끊기고 check가 1이라면 이전 부분 문자열은 반복된 것이므로 cnt를 문자열로 변환하여 cnt_s의 사이즈만큼 sum에 더한다.
7. s의 마지막 문자에 도달하면 중간에 부분 문자열 반복이 끊긴 적이 없었을 경우를 고려해 6번을 다시 실행한다.
(*입력이 만약 aaaaaaaaaa (=a가 열 번 반복됨)라면 축약이 10a이므로 1, 0, a이기 때문에 3이어야 한다.)
'코테 > 구현' 카테고리의 다른 글
| [C/C++] 프로그래머스스쿨 자물쇠와 열쇠, 구현 (0) | 2023.02.26 |
|---|---|
| [C/C++] 백준 3190, 구현 (0) | 2023.02.18 |
| [C/C++] 나동빈 문자열 재정렬, 구현 (0) | 2023.02.15 |
| [C/C++] 백준 18406, 구현 (0) | 2023.02.15 |
| [C/C++] 나동빈 게임 개발, 구현 (0) | 2023.02.15 |