https://programmers.co.kr/learn/courses/30/lessons/60057
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void concat_string(string &full, string &part, int cnt)
{
// 중복이 2이상이면 숫자+문자 덧붙이기
if (cnt > 1)
{
full += to_string(cnt);
}
// 중복없으면 문자만 덧붙이기
full += part;
}
int solution(string s) {
int len = s.size();
int answer = len;
// 자를 문자열 크기 : 1부터 len / 2의 크기
for (int i = 1; i <= len / 2; ++i)
{
string last = "";
string full = "";
int cnt = 1;
// 각 부분 문자열 : j인덱스부터 i의 크기로 문자열을 자르기
for (int j = 0; j < len; j += i)
{
int end = (j + i - 1 < len) ? i : len - j;
string tmp = s.substr(j, end);
// 이전 문자열과 같다면 카운트 추가
if (last.compare(tmp) == 0)
{
++cnt;
}
// 이전 문자열과 다르다면
else
{
// 전체 문자열에 카운트 및 부분 문자열 더하기
concat_string(full, last, cnt);
last = tmp;
cnt = 1;
}
}
concat_string(full, last, cnt);
// 최소길이 갱신
answer = min((int)full.size(), answer);
}
return answer;
}
원래 레벨1이었던 것 같은데 레벨2로 분류가 바뀌었나보다.
전에 java로 풀었던 적이 있는데
C++로 다시한번 풀어보니 그때보다 풀이가 더 깔끔해졌다ㅋ.ㅋ
직전 부분 문자열을 저장하고
매번 직전 부분 문자열과 비교해서 중복횟수를 카운팅 하면 된다!
'Algorithm > 프로그래머스' 카테고리의 다른 글
[프로그래머스]2020 카카오 인턴십 : 수식 최대화 (level 2) (c++) (0) | 2020.07.07 |
---|---|
[프로그래머스]2020 카카오 인턴십 : 키패드 누르기 (level 1) (c++) (0) | 2020.07.07 |
[프로그래머스]연습문제 : 멀리 뛰기 (level 3)(c++) (0) | 2020.07.06 |
[프로그래머스]2017 카카오코드 본선 : GPS (level 3) (c++) (0) | 2020.07.05 |
[프로그래머스]2017 카카오코드 본선 : 리틀 프렌즈 사천성 (level 3) (c++) (0) | 2020.07.04 |
댓글