알고리즘/문제풀이

[정렬] 문자열 압축

lipnus 2022. 8. 7. 21:50
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/60057

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

최초코드

import java.util.*;

class Solution {
    public int solution(String s) {
        
        StringBuffer sb = new StringBuffer();
        int answer = 1000;
        
        if(s.length()==1) return 1;
        
        int count = s.length() / 2;
        for(int len=1; len <= count; len++) {
            
            int i=0;
            String prev = "";
            int sameCount = 0;
            
            while(i<s.length()) {
                int start = (i)*len;
                int end = (i+1)*len <= s.length() ? (i+1)*len : s.length();
                
                String str = s.substring(start, end);
                // System.out.println(str);
                
                if(prev.equals(str)) { // 앞이랑 같다
                    sameCount++;
                    if(end == s.length() && sameCount > 1) sb.append(Integer.toString(sameCount)); // 마지막이다
                }
                else { // 앞이랑 다르다
                    if(sameCount > 1) sb.append(Integer.toString(sameCount));
                    sb.append(prev);
                    sameCount = 1;
                }
                
                prev = str;
                
                if(s.length() <= (i+1)*len) { // 마지막 꼬랑지 붙이기
                    sb.append(str);
                    break;  
                } 
                
                i++;
            }
            answer = Math.min(answer, sb.length());
            // System.out.println(sb);
            sb.setLength(0);
        }
        
        return answer;
    }
}

테스트케이스5는 전체 길이가 1인 문자열. ㅎㄷㄷ한 예외..

 

 

정리

import java.util.*;

class Solution {
    public int solution(String s) {
        StringBuffer sb = new StringBuffer();
        int answer = Integer.MAX_VALUE;
        
        if(s.length() == 1) return 1; // 예외처리
        
        int count = s.length() / 2;
        for(int len=1; len <= count; len++) {
            
            int i=0;
            String prev = "";
            int sameCount = 0;
            
            while(i < s.length()) {
                
                int start   = (i)*len;
                int end     = Math.min((i+1)*len, s.length());
                String str = s.substring(start, end);
                
                if(prev.equals(str)) { // 앞과 동일
                    sameCount++;
                }
                else { // 앞과 다름
                    if(sameCount > 1) sb.append(Integer.toString(sameCount));
                    sb.append(prev);
                    sameCount = 1;                    
                }
                
                if(end == s.length()) { // 마지막 꼬랑지 붙이기
                    if(sameCount > 1) sb.append(Integer.toString(sameCount));
                    sb.append(str);
                    break;  
                }
                
                prev = str;
                i++;
            }
            
            answer = Math.min(answer, sb.length());
            // System.out.println(sb);
            sb.setLength(0);
        }
        return answer;
    }
}
반응형

'알고리즘 > 문제풀이' 카테고리의 다른 글

[프로그래머스] 정수삼각형  (0) 2023.01.01
Word Break  (0) 2022.09.04
[정렬] 오픈채팅방  (0) 2022.08.07
[Heap] 디스크 컨트롤러  (0) 2022.08.07
[이진수] Binary Gap  (0) 2019.04.11