728x90
반응형
문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/60057
풀이
압축한 문자열 중 가장 짧은 길이를 찾는 문제이다. 중요한점은 가장 짧은 것의 길이를 리턴해야 한다!
1단위부터 문자열 길이의 절반까지 압축 단위를 잡자. 그 이유는 절반 이상은 압축이 불가능하기 때문이다.
a는 비교할 문자열이고,
temp는 압축 단위에서 압축된 문자열 이다. (aabbaccc 에서 단위가 1이라면 -> 2a2baccc)
for문을 한번 더 순회하며 일치하는 경우 cnt를 증가하고, 그렇지 않으면 temp에 해당 부분을 반영한다.
(cnt > 1)의 조건은 일치하는 쌍이 2개 이상이어야 2a 이런식으로 숫자로 표시하기 때문
내부의 for문이 끝난 후, 남아 있는 경우를 대비해 temp를 처리해주면 압축된 문자열이 temp에 저장되어 있을 것이다.
따라서, 길이를 비교해 작은 값을 answer에 대입해주면 된다.
for(int i = 1; i <= s.length() / 2; i++){
int cnt = 1; // 같은 쌍 개수
string temp = "", a = "";
a = s.substr(0, i);
for(int j = i; j < s.length(); j+= i){
if(s.substr(j, i) == a)
cnt++;
else{
if(cnt > 1)
temp += to_string(cnt);
temp += a;
a = s.substr(j, i);
cnt = 1;
}
}
if(cnt > 1)
temp += to_string(cnt);
temp += a;
answer = min(answer, (int)temp.length());
}
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string s) {
int answer = s.length();
// 단위 개수
for(int i = 1; i <= s.length() / 2; i++){
int cnt = 1; // 같은 쌍 개수
string temp = "", a = "";
a = s.substr(0, i);
for(int j = i; j < s.length(); j+= i){
if(s.substr(j, i) == a)
cnt++;
else{
if(cnt > 1)
temp += to_string(cnt);
temp += a;
a = s.substr(j, i);
cnt = 1;
}
}
if(cnt > 1)
temp += to_string(cnt);
temp += a;
answer = min(answer, (int)temp.length());
}
return answer;
}
728x90
반응형
'Tech > Algorithm' 카테고리의 다른 글
[BOJ] 백준 18428 감시 피하기 c++ (백트래킹) (0) | 2023.07.05 |
---|---|
[BOJ] 백준 1021 회전하는 큐 c++ (deque) (0) | 2023.07.05 |
[BOJ] 백준 6118 숨바꼭질 c++ (bfs) (0) | 2023.05.29 |
[프로그래머스] 네트워크 c++ java (dfs) Level3 (0) | 2023.05.05 |
[BOJ] 백준 2143 두 배열의 합 c++ (이분탐색, 누적 합) (2) | 2023.04.20 |