import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
//쪼개기 문자열 만들기
String tempAnswer="";
if(s.length()==1)return 1;
Stack<String> stack = new Stack<>();
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int i=1; i<=s.length()/2; i++){ //1번부터 length/2까지 쪼갤예정
//i는 쪼개는 숫자가 된다.
//default값 지정
for(int k=0; k<s.length(); k +=i){
int x = Math.min(k+i, s.length());
String temp = s.substring(k,x);
if(stack.isEmpty()){
stack.push(temp);
continue;
}
if(stack.peek().equals(temp)){
stack.push(temp);
}else{//다른게 들어온 경우
if(!stack.isEmpty()){
String word = stack.peek();
int size = stack.size();
if(size ==1){
tempAnswer += word;
}else{
tempAnswer +=(stack.size())+word;
}
}
stack.clear();
stack.push(temp);
}
// System.out.print(s.substring(k,x)+ " ");
}
//마지막을 Stack에 남은 값 까지 더해줌
if(!stack.isEmpty()){
String word = stack.peek();
int size = stack.size();
if(size ==1)tempAnswer +=word;
else tempAnswer +=(stack.size())+word;
}
stack.clear();
pq.add(tempAnswer.length());
tempAnswer="";
// System.out.println();
}
return pq.poll();
}
}
나는 이 문제를 Stack + PriorityQueue를 활용해서 풀었다.
근데 굳이 이렇게 풀지 않아도 되긴 함 ㅋ
우선 스택에 값을 넣는 방향으로 생각했다.
이런식으루 구성했다.
for문을 다 돌고 Stack에 마지막으로 쌓여있는 부분이 남게된다.
for(int i=1; i<=s.length()/2; i++){ //1번부터 length/2까지 쪼갤예정
//for문 안의 로직들
}
//마지막을 Stack에 남은 값 까지 더해줌
if(!stack.isEmpty()){
String word = stack.peek();
int size = stack.size();
if(size ==1)tempAnswer +=word;
else tempAnswer +=(stack.size())+word;
}
stack.clear();
pq.add(tempAnswer.length());
tempAnswer="";
// System.out.println();
}
for문안의 연산이 다 끝나고 뒤 쪽의 값이 남게된다. 즉 끝부분에 있는 애들은 뒷 부분에 자기랑 다른게 없으니까? 위처럼 처리가 안되고 남게 되는것
그 부분을 처리해준다.
그리고 완성된 문자열의 길이를 PriorityQueue로 담았다.
그 후 return하면 끝~~~
인줄 알았는데 edge case가 1개 남아있었다.
해당 부분을 못찾아서 조금 고민했는데 문제에서 주어지는 조건의 범위가 1부터 <1000 까지인 것을 생각해 1인 경우를 넣어봤다.
그랬더니 통과 ㅠㅠ
그래서
if(s.length()==1)return 1;
길이가 1 인경우는 1을 리턴하도록 설정했다.
통과하지 못할 땐 언제나 edgecase를 생각하자