코딩테스트
[JAVA] 프로그래머스 문자열 압축
mingg123
2021. 4. 17. 20:36
programmers.co.kr/learn/courses/30/lessons/60057
코딩테스트 연습 - 문자열 압축
데이터 처리 전문가가 되고 싶은 "어피치"는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문
programmers.co.kr
1차 코드 (실패)
class Solution {
public int solution(String s) {
int answer = 1001;
for(int i = 1; i <= s.length()/2; i++) {
String result = "";
int prefix = 1;
String now, next = "";
for(int j = 0; j<= s.length(); j++) {
int start, end = 0;
start = i * j;
end = i * (j + 1);
if(end > s.length()) end = s.length();
now = next;
if(start > s.length()) {
result = result + Integer.toString(prefix) + now;
break;
}
next = s.substring(start, end);
if(now.equals(next)) {
prefix ++;
} else {
result = result + Integer.toString(prefix) + now;
prefix = 1;
}
}
result = result.replaceAll("1", "");
answer = (Math.min(answer, result.length()));
}
return answer;
}
}
원인은 replaceAll("1", "") 이였다.
이유는 만약 10a10b가 나오면 replaceAll시 0a0b가 되기 때문.
이걸 깨닫지 못하고 헤맸다.
2차 코드 (성공)
class Solution {
public int solution(String s) {
if(s.length() == 1) return 1;
int answer = 1001;
for(int i = 1; i <= (s.length()/2) ; i++) {
String result = "";
int prefix = 1;
String now, next = "";
for(int j = 0; j<= s.length() /i; j++) {
int start, end = 0;
start = i * j;
end = i * (j + 1) > s.length() ? s.length() : i * (j + 1);
now = next;
next = s.substring(start, end);
if (now.equals(next)) {
prefix++;
} else {
if (prefix <= 1) {
result = result + now;
} else {
result = result + (prefix) + now;
}
prefix = 1;
}
}
if (prefix <= 1) {
result = result + next;
} else {
result = result + (prefix) + next;
}
// result = result + (prefix) + next;
answer = (Math.min(answer, result.length()));
}
return answer;
}
}
또 한가지 주의해야 할 점은 if문을 한번 더 태우면 run Time 에러가 발생했다.
class Solution {
public int solution(String s) {
if(s.length() == 1) return 1;
int answer = 1001;
for(int i = 1; i <= (s.length()/2) ; i++) {
String result = "";
int prefix = 1;
String now, next = "";
for(int j = 0; j<= s.length() /i; j++) {
int start, end = 0;
start = i * j;
// end = i * (j + 1) > s.length() ? s.length() : i * (j + 1);
end = i * (j+1);
if(end > s.length()) end = s.length;
now = next;
next = s.substring(start, end);
if (now.equals(next)) {
prefix++;
} else {
if (prefix <= 1) {
result = result + now;
} else {
result = result + (prefix) + now;
}
prefix = 1;
}
}
if (prefix <= 1) {
result = result + next;
} else {
result = result + (prefix) + next;
}
// result = result + (prefix) + next;
answer = (Math.min(answer, result.length()));
}
return answer;
}
}