문제
https://school.programmers.co.kr/learn/courses/30/lessons/60057
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
구현문제인데 어려운 문제였다. 다시 풀어야 되는 문제
처음에 풀었을 때 맨 마지막 문자열을 처리가 안되어서 애를 많이 먹은 문제였다.
풀이
반복되는 문자의 길이는 주어진 문자열 길이의 절반을 넘을 수 없다.
이를 for문을 이용하여 반복되는 문자의 길이를 증가시킨다.
주어진 문자열에서 처음부터 반복되는 문자열이 몇개인지를 찾아나가야 한다. 중간부터 시작해서 찾아나가는 것이 아니다.
count는 반복되는 규칙 횟수를 저장한다. 1부터 시작하였는데 그 이유는 안쪽 for문에서 그다음 문자열부터 찾아가기 때문이다.
규칙에서 벗어나는 문자열을 발견했을 경우 새로운 문자열을 반복되는 문자열로 변경하고 다시 그 다음부터 찾아나간다.
그런데 주어진 문자열의 길이가 배수로 떨어지지 않는다면 문제가 발생한다. 나머지 문자열이 남게되므로 이를 마지막에 붙여준다.
코드
class Solution {
public int solution(String s) {
int answer = s.length();
for(int i = 1; i<=s.length()/2;i++){
StringBuilder result = new StringBuilder();
int count = 1;
String str = s.substring(0, i);
for(int j=i;j<=s.length();j+=i){
// j<=s.length()인 이유는 배수로 떨어질 때 마지막에 값이 넣어지지 않음(문자열이 같을 경우에) 따라서 강제로 다르게 만들어줘서 값을 넣어줌
int endIdx = Math.min(s.length(), j+i);
if(str.equals(s.substring(j, endIdx))){
count += 1;
}
else{
if(count >= 2){
result.append(count);
}
result.append(str);
str = s.substring(j, endIdx);
count = 1;
}
}
result.append(str);
answer = Math.min(answer, result.length());
}
return answer;
}
}