
안녕하세요. 오늘은 프로그래머스의 문자열 압축문제를 풀어보려고 합니다. 이 문제는 2020년도 KAKAO BLIND RECRUITMENT에서 출제되었습니다.!!
https://programmers.co.kr/learn/courses/30/lessons/60057
주어진 String s를 압축하려는 길이(i) 대로 잘라서 String배열에 차례로 넣어줍니다. 이 때 String배열의 길이는 s의 길이를 i(압축하려는 길이)로 나눈 값이 됩니다.
s를 정제해서 새로운 String배열인 str에 넣고 나서 compress function을 수행합니다. compress함수에서는 str배열의 길이만큼 for문을 돌면서 str[i-1]과 str[i]가 같은지 확인하고, StringBuilder를 이용해서 결과를 뒤에 붙입니다.
| 테스트케이스 | 문자열 압축 | 결과 |
|---|---|---|
| "xxxxxxxxxxyyy" | "10x3y" | 5 |
| "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | "100x" | 4 |
| "zxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | "z100x" | 5 |
| "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxz" | "100xz" | 5 |
| "a" | "a" | 1 |
해당 테스트 케이스를 참고하여 제 코드에서 잘못된 곳을 찾을 수 있었습니다. 마지막케이스인 "a"의 경우 answer에 처음 초기화한 Integer.MAX_VALUE값이 그대로 남아있었는데, answer를 return하기 전 if문을 추가해 해당 문제를 해결하였습니다.
class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
for (int i = 1; i <= s.length() / 2; i++) {
int len = s.length() % i != 0 ? s.length() / i + 1 : s.length() / i;
String[] str = new String[len];
for (int j = 1; j < str.length; j++) {
str[j - 1] = s.substring((j - 1) * i, j * i);
if (j == str.length - 1) {
str[j] = s.substring(j * i, s.length());
}
}
String compress = compress(str);
answer = answer > compress.length() ? compress.length() : answer;
}
if (answer == Integer.MAX_VALUE) answer = 1;
return answer;
}
private String compress(String[] splStr) {
int idx = 1;
String before = splStr[0];
StringBuilder sb = new StringBuilder();
for (int i = 1; i < splStr.length; i++) {
if (before.equals(splStr[i])) {
idx++;
} else {
if (idx == 1) {
sb.append(before);
idx = 1;
} else {
sb.append(idx + before);
idx = 1;
}
}
before = splStr[i];
}
if (idx == 1) {
sb.append(before);
} else {
sb.append(idx + before);
}
return sb.toString();
}
}
처음에 코드를 제출해보니 딱 한 케이스가 틀려서 굉장히 아쉬웠고, 어떤 부분이 틀렸는지 찾기가 힘들었습니다. 평소에는 문제에서 주어진 테스트 케이스만 이용헤서 문제를 푼 후 다른 분들이 올려둔 테스트 케이스를 추가로 확인했었는데, 다음부터는 다양한 테스트 케이스를 직접 생각해서 적용해봐야겠다고 느꼈습니다.
좋은 글이네요 도움이 많이 됐습니다 ;)