Algorithms/- 프로그래머스
프로그래머스 - 문자열 압축 [자바]
자굿
2022. 2. 1. 01:26
- 문제 링크 : 문자열 압축
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
정답
class Solution {
public int solution(String s) {
int len = s.length();
int answer = len;
for(int i=1; i<=len/2; i++){
String str1 = s.substring(0, i);
int cnt = 1;
int min = 0;
for(int j=i; j<=len; j+=i){
String str2 = s.substring(j, j+i > len ? len : j+i);
if(str1.equals(str2)){
cnt++;
}else{
min += str1.length();
if(cnt > 1){
min += (int)Math.log10(cnt) + 1;
}
str1 = str2;
cnt = 1;
}
}
min += str1.length();
if(cnt > 1){
min += (int)Math.log10(cnt) + 1;
}
answer = Math.min(answer, min);
}
return answer;
}
}
분석
- 문자열 다루기 문제
//end index에 3항 연산자를 사용하여 아웃바운드 방지
String str2 = s.substring(j, j+i > len ? len : j+i);
- 중복된 숫자가 2자리 이상이 되는 경우를 생각하지 않음
- 단순 cnt > 1인 경우 +1을 해주어 실패가 발생함
//cnt > 1 -> min++; 하면 아래의 경우 실패 "aaaaaaaaaaaabcd" -> "12abcd" 이므로 6 자리 "xxxxxxxxxxyyy" -> "10x3y" 이므로 5 자리
계속 제출에서 실패한 코드
class Solution {
public int solution(String s) {
int len = s.length();
int answer = len;
for(int i=1; i<=len/2; i++){
String str1 = s.substring(0, i);
int cnt = 1;
int min = 0;
for(int j=i; j<=len; j+=i){
String str2 = s.substring(j, j+i > len ? len : j+i);
if(str1.equals(str2)){
cnt++;
}else{
min += str1.length();
if(cnt > 1){
min++; //실패 원인
}
str1 = str2;
cnt = 1;
}
}
min += str1.length();
if(cnt > 1){
min++; //실패 원인
}
answer = Math.min(answer, min);
}
return answer;
}
}
반응형