https://programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
그동안 문제는 많이 풀었는데 오랜만에 포스팅한다.
정말 문자열 처리하는 문제 꽤 많이 풀었다고 생각했는데 역시 할 때마다 너무 어렵고 힘들다. 호다다닥 풀어야 하는데 너무 오래걸린다. 매번 적응이 안돼 하...
풀이를 해보자.
큰 틀을 보면
int answer = 1001;
String ans = "";
으로 선언하고 문자열을 압축한 것을 ans 에 넣고 그 길이를 매번 업데이트 해서 answer 넣을 것이다.
다음은
for(int i=1; i<=s.length(); i++){
....
}
문자를 1개씩 자를 때, 2개씩 자를 때 .... 로 for 문을 만들었다. 가장 큰 for문이다. 여기 안에 이거저거 다 넣을거다.
이제 안의 핵심을 보면
String temp,temp2;
for(int i=1; i<=s.length(); i++){
StringBuilder sb = new StringBuilder(ans);
temp = s.substring(0,i);
int count = 1;
int j;
for(j=i; j+i<=s.length(); j=j+i){
temp2 = s.substring(j,j+i);
if(temp.equals(temp2)){
count++;
}
else{
if(count!=1) sb.append(count);
sb.append(temp);
temp = temp2;
count = 1;
}
}
if(count!=1) sb.append(count);
sb.append(temp);
if(j+i>s.length()){
sb.append(s.substring(j));
}
if(sb.length() < answer) answer = sb.length();
}
이렇게 생겼다.
1. 우선 temp 에 0번째 index 부터 i 번째 index 까지 가져온다! 1개씩 자르면 1단어 일거고 2개씩 자르면 2단어 일거고 이런식으로.
2. 반복되는 개수를 위한 count 그리고 인덱스를 알아야해서 j를 for문 바깥에 선언하였다.
3. 그 후 String s 의 를 i개씩 잘라가며 확인한다. 그걸 temp 랑 비교해서 몇개있는지 확인한다.
4. 만약 다른게 나오면 여태까지 개수와 반복된 문자열을 append 한다! 단 count 가 1 일 경우는 count 는 뺀다.
5. for문을 빠져나오면 추가로 해줄게 있다. 마지막에 같은게 연속해서 나온거는 for 문 안에 else 에 안들어가서 추가가 안되어 있으므로 추가로 append 한다.
6. 하나 더 해줄 게 있다. 마지막에 i개씩 잘라야하는데 길이가 넘어가서 못자른 나머지 문자들을 다 append 해준다.
7. 이제 길이를 비교해서 answer 를 업데이트 해준다!
남의 코딩 읽는게 제일 힘들다. 남들은 어떻게 설명을 그렇게 잘하는지 모르겠다.
하여간 아래는 전체 코드이다.
import java.io.*;
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 1001;
String ans = "";
String temp,temp2;
for(int i=1; i<=s.length(); i++){
StringBuilder sb = new StringBuilder(ans);
temp = s.substring(0,i);
int count = 1;
int j;
for(j=i; j+i<=s.length(); j=j+i){
temp2 = s.substring(j,j+i);
if(temp.equals(temp2)){
count++;
}
else{
if(count!=1) sb.append(count);
sb.append(temp);
temp = temp2;
count = 1;
}
}
if(count!=1) sb.append(count);
sb.append(temp);
if(j+i>s.length()){
sb.append(s.substring(j));
}
if(sb.length() < answer) answer = sb.length();
}
return answer;
}
}
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers - 자바] 구명보트 (2) | 2022.03.17 |
---|---|
[Programmers - 자바] 거리두기 확인하기 (0) | 2022.03.16 |
[Programmers - c++] 신규 아이디 추천 (0) | 2022.02.13 |
[Programmers - c++] 비밀지도 (0) | 2022.02.13 |
[Programmers - c++] 모의고사 (1) | 2022.02.07 |