오늘 풀어본 문제는
프로그래머스 문자열압축 입니다.
import java.util.*;
class Solution {
public int solution(String s) {
if(s.length() < 2) return 1;
int answer = Integer.MAX_VALUE;
for(int i = 1; i <= s.length()/2; ++i)
{
StringBuilder sb = new StringBuilder();
answer = Math.min(compress(s,sb,i),answer);
}
return answer;
}
static int compress(String origin, StringBuilder cur,int len)
{
ArrayList<String> al = new ArrayList<>();
for(int i = 0; i < origin.length(); i+=len)
{
if(i+len > origin.length()) al.add(origin.substring(i));
else al.add(origin.substring(i,i+len));
}
String pre = al.get(0);
int cnt = 1;
for(int i = 1; i < al.size(); ++i)
{
if(pre.equals(al.get(i))) cnt++;
else
{
if(cnt > 1)
{
cur.append(cnt).append(pre);
pre = al.get(i);
cnt = 1;
}
else
{
cur.append(pre);
pre = al.get(i);
}
}
}
if(cnt > 1) cur.append(cnt).append(pre);
else cur.append(pre);
return cur.length();
}
}
중복된 문자열 패턴을 찾아 압축하는 문제입니다.
문자열 길이의 절반이 넘어가면 중복값이 나올 수 없으므로 length/2 까지만 진행합니다.
함수에 len값을 넘겨주면, ArrayList에 해당 길이만큼 문자열을 분리하여 담습니다.
ArrayList를 탐색하며 이전 문자열과 비교하여 카운트값 + 문자열 또는 기존 문자열을 StringBuilder에 붙여 새로운 문자열을 만들어나갑니다.
마지막 문자열은 pre에 남아있게 되므로, 반복문을 벗어난 이후 붙여줍니다.
마지막으로 StringBuilder에 완성된 문자열의 길이를 반환해주고,
변수 answer에 최솟값을 저장합니다.
문제를 처음 보고 재귀를 사용하려 했는데, 문자열 최대길이가 1000이길래 생각보다 짧네? 하고 생각나는대로 그냥 짜봤습니다. 한방에 통과해서 다행이네요 ㅋㅋㅋㅋㅋ