공부하는 스누피
[JAVA] 문자열 압축 - StringBuffer 본문
https://programmers.co.kr/learn/courses/30/lessons/60057
생각 과정
- 길이가 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();
}
}
결과
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 |