문자열압축

Yellta·6일 전
0

알고리듬리듬

목록 보기
18/20

문자열 압축

문제링크

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을 리턴하도록 설정했다.

REVIEW

통과하지 못할 땐 언제나 edgecase를 생각하자

profile
Yellta가 BE개발해요! 왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜왜 가 제일 중요하죠

0개의 댓글