공부하는 스누피

[JAVA] 문자열 압축 - StringBuffer 본문

Algorithms/코딩테스트 문제풀이

[JAVA] 문자열 압축 - StringBuffer

커피맛스누피 2020. 8. 2. 01:43

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

 

코딩테스트 연습 - 문자열 압축

데이터 처리 전문가가 되고 싶은 어피치는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자

programmers.co.kr

 

생각 과정 

- 길이가 n인 문자열을 1개, 2개,,,, n개씩 끊어 문자열 리스트에 넣는다.

- 다 넣은 후 리스트를 순회하면서 같은 문자열이 반복되는지 검사한다.

- 반복이 유지되면 count를 늘리고, 종료되면 count한 값과 이때까지 중복이었던 문자열을 StringBuffer에 붙인다.

- 반복하지 않는 경우는 count없이 StringBuffer에 바로 붙인다.

- solution 메소드는 끊는 단위를 문자열 길이까지 증가시키면서 해당 방법으로 압축한 문자열의 길이를 return해주는 shrink 메소드를 호출한다. 호출된 값 중 가장 작은 값이 return된다.

 

코드 구현

import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = s.length();
        int strlen = 0;
        for(int i=1;i<s.length();i++){
            strlen = shrink(s, i);
            answer = Math.min(strlen, answer);
        }
        return answer;
    }
    
    public int shrink(String s, int n){
        //System.out.println(n);
        List<String> list = new ArrayList();
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<s.length();i++){
            if(i+1<n){
                sb.append(s.charAt(i));
            }
            else if(i+1>n && (i+1)%n > 0){
                sb.append(s.charAt(i));
            }
            else{
                sb.append(s.charAt(i));
                String str = sb.toString();
                list.add(str);
                sb.setLength(0);
            }
        }
        list.add(sb.toString());
        
        int counter = 0;
        String pre = "";
        sb.setLength(0);
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String str = it.next();

            if(pre.equals(str)){
                counter ++;
            }else{
                if(pre.length() > 0){
                    if(counter>1)
                        sb.append(""+counter+pre);
                    else
                        sb.append(pre);
                    if(str.length()<n){
                        sb.append(str);
                    }
                }
                pre = str;
                counter = 1;
            }
        }
        String result = sb.toString();
                        //System.out.println(result);
        return result.length();
    }
}

결과

level2 중에 level1문제였던 것 같다.

 

StringBuffer와 StringBuilder의 차이점

StringBuffer와 StringBuilder 모두 문자열이 저장된 메모리에 새로운 문자열을 붙이는 방식이다.

StringBuffer는 동기화가 보장되어 멀티스레드 환경에 적합하지만,

StringBuilder는 동기화가 보장되어있지 않아 단일 스레드 환경에 적합하다(저장소에 동시 접근이 가능함).

 

Iterator

Iterator는 List의 요소를 탐색하는 클래스로, List.iterator() 메소드로 생성하고, 선언할 때 제네릭으로 타입을 정해줄 수 있다.

탐색 구현은 while문을 사용한다.

while(it.hasNext()){ //가져올 요소가 있는지 확인한다.

    Object item = it.next(); //다음 요소를 가져온다.

~~~

}

'Algorithms > 코딩테스트 문제풀이' 카테고리의 다른 글

[JAVA] 스타트와 링크 - DFS  (0) 2020.08.19
[JAVA] 퇴사 - DFS  (0) 2020.08.19
[JAVA] 다트 게임 - StringBuffer  (0) 2020.07.26
[JAVA] 14502 연구실 - DFS  (0) 2020.07.24
[JAVA] 연산자 끼워넣기 - DFS  (0) 2020.07.23
Comments