문제풀이 흐름

  1. 1부터 입력 문자열 s의 길이만큼 자를 문자열의 길이를 설정하며 반복
  2. 설정된 길이만큼 문자열을 잘라 낸 token의 배열 생성
  3. 문자열을 비교하며 token의 배열을 하나의 문자열로 압축
  4. 1~3 과정으로 압축된 문자열 중 가장 짧은 길이 반환

코드 작성

1. 1부터 입력 문자열 s의 길이만큼 자를 문자열의 길이를 설정하며 반복

int min = Integer.MAX_VALUE;
for (int length = 1; length <= s.length(); length++) {
		//문자열 압축 후 가장 짧은 길이 선택
}
return min;
private int compress(String source, int length) {
		//압축한 문자열의 길이 반환
}

2. 설정된 길이만큼 문자열을 잘라 낸 token의 배열 생성

private List<String> split(String source, int length) {
	List<String> tokens = new ArrayList<>();
	// source를 length만큼씩 잘라 tokens 리스트에 추가
	return tokens;
}

문자열을 자르는 시작 인덱스는 0부터 시작하여 length만큼씩 증가합니다. 따라서 다음 반복문으로 모든 startIndex를 순회할 수 있습니다.

이때 endIndex는 startIndex + length이지만, 이것이 문자열 범위 밖이라면 문자열의 끝까지 정상적으로 잘릴 수 있도록 다음과 같이 작성합니다.

for (int startIndex = 0; startIndex < source.length(); startIndex += length) {
	int endIndex = startIndex + length;
	if (endIndex > source.length()) endIndex = source.length();
	tokens.add(source.substring(startIndex, endIndex));
}

3. 문자열을 비교하며 token의 배열의 하나의 문자열로 압축

연속으로 중복된 문자열을 검사해야 하므로 직전에 등장한 문자열을 담는 last 변수와 그 등장 횟수를 담는 count 변수를 선언합니다.

String last = "";
int count = 0;
for (String token : split(source, length)) {

}
  1. 현재 검사하는 문자열 token이 직전에 등장한 문자열과 같다면 등장 횟수만 증가해주면 됩니다.
  2. 새로운 토큰이 등장했다면 직전까지 등장한 문자열을 이용하여 압축 문자열을 구성해줍니다. 이때 등장 횟수 count는 2 이상일때만 압축 문자열에 포함되고, 압축 문자열을 구성한 후에는 현재 검사한 token부터 다시 셀 수 있도록 last와 count를 업데이트해야 한다는 것을 잊지 마세요.