프로그래머스 - 문자열 압축 (Level 2)
2024. 1. 6. 04:01ㆍ코딩테스트 정리(자바)
728x90
너무 어려워서 풀지 못했다.
수많은 도전을 했지만 실패...
도통 모르겠다.
class Solution {
public int solution(String s) {
int len=s.length();
String s1="";
String s2="";
int count=1;
String str=s;
int answer=str.length();
for(int i=0;i<len/2;i++){
StringBuilder sb=new StringBuilder();
for(int j=i+1;j<len;j++){
s1=s.substring(i,j);
s2=s.substring(i+1,j+1);
if(s1.equals(s2)) { //같다면
count++;
}
else{ //다르다면
if(count!=1) {// count가 0이 아니라면
sb.append(Integer.toString(count)).append(s1);
}
else {
sb.append(s1);
}
}
}
if(str.length()>sb.toString().length()){
str=sb.toString();
answer=str.length();
}
}
return answer;
}
}
책에서의 풀이
: 1. 1부터 s의 길이만큼 자를 문자열의 길이를 설정하며 반복
2. 설정된 길이만큼 문자열을 잘라서 token 배열에 담기
3. token 배열에 담긴 문자열을 비교하며 하나의 문자열로 압축
4. 1~3 과정으로 압축된 문자열 중 가장 짧은 길이 반환
import java.util.ArrayList;
import java.util.List;
public class 문자열_압축 {
private List<String> split(String source, int length) { //압축하기 위해 length 길이씩 문자열을 잘라 리스트에 담아주는 메소드
List<String> tokens = new ArrayList<>();
for (int startIndex = 0; startIndex < source.length(); startIndex += length) {
//문자열을 자르는 시작 인덱스는 0부터 시작하여 length만큼씩 증가
int endIndex = startIndex + length; //substring의 두번째 인자
if (endIndex > source.length()) endIndex = source.length(); //endIndex가 문자열 길이 밖으로 벗어나면 조정
tokens.add(source.substring(startIndex, endIndex)); //문자열 잘라 리스트에 추가
}
return tokens;
}
private int compress(String source, int length) { //문자열을 압축하고, 압축된 문자열의 길이를 반환하는 메소드
StringBuilder builder = new StringBuilder();
String last = ""; //직전에 등장한 문자열 담는 변수
int count = 0; //등장 횟수 세는 변수
for (String token : split(source, length)) {
if (token.equals(last)) { //직전에 등장한 문자열과 같다면 등장 횟수 증가
count++;
} else { //직전에 등장한 문자열과 다르다면
if (count > 1) builder.append(count); //count가 1보다 크면 압축 문자열에 포함
builder.append(last); //count가 1보다 같거나 작으면 직전 문자만 담기
last = token; //last를 현재 문자열로 초기화
count = 1; //등장 횟수 1로 초기화
}
}
//마지막 문자열 담아야 함.
if (count > 1) builder.append(count);
builder.append(last);
return builder.length();
}
public int solution(String s) {
int min = Integer.MAX_VALUE; //최솟값을 저장할 변수
for (int length = 1; length <= s.length(); length++) {
//1부터 문자열 s의 길이만큼 자를 문자열의 길이를 설정
//s의 길이가 1인 경우를 위해 s.length()/2까지 하지 않음.
int compressed = compress(s, length);
if (compressed < min) { //가장 짧은 압축 길이를 찾기
min = compressed;
}
}
return min;
}
}
728x90
'코딩테스트 정리(자바)' 카테고리의 다른 글
| 프로그래머스 - 쿼드 압축 후 개수 세기(Level 2) (2) | 2024.01.08 |
|---|---|
| 재귀함수 (0) | 2024.01.08 |
| 문자열 찾기와 바꾸기 (3) | 2024.01.05 |
| 정규표현식 (4) | 2024.01.05 |
| 프로그래머스 - 신규 아이디 추천 (Level 1) (0) | 2024.01.04 |