Skip to content

Commit d56ea42

Browse files
committed
[level 2] Title: 문자열 압축, Time: 20.35 ms, Memory: 82.2 MB -BaekjoonHub
1 parent f5e649a commit d56ea42

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# [level 2] 문자열 압축 - 60057
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/60057)
4+
5+
### 성능 요약
6+
7+
메모리: 82.2 MB, 시간: 20.35 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2020 KAKAO BLIND RECRUITMENT
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 10월 07일 13:15:06
20+
21+
### 문제 설명
22+
23+
<p>데이터 처리 전문가가 되고 싶은 <strong>"어피치"</strong>는 문자열을 압축하는 방법에 대해 공부를 하고 있습니다. 최근에 대량의 데이터 처리를 위한 간단한 비손실 압축 방법에 대해 공부를 하고 있는데, 문자열에서 같은 값이 연속해서 나타나는 것을 그 문자의 개수와 반복되는 값으로 표현하여 더 짧은 문자열로 줄여서 표현하는 알고리즘을 공부하고 있습니다.<br>
24+
간단한 예로 "aabbaccc"의 경우 "2a2ba3c"(문자가 반복되지 않아 한번만 나타난 경우 1은 생략함)와 같이 표현할 수 있는데, 이러한 방식은 반복되는 문자가 적은 경우 압축률이 낮다는 단점이 있습니다. 예를 들면, "abcabcdede"와 같은 문자열은 전혀 압축되지 않습니다. "어피치"는 이러한 단점을 해결하기 위해 문자열을 1개 이상의 단위로 잘라서 압축하여 더 짧은 문자열로 표현할 수 있는지 방법을 찾아보려고 합니다.</p>
25+
26+
<p>예를 들어, "ababcdcdababcdcd"의 경우 문자를 1개 단위로 자르면 전혀 압축되지 않지만, 2개 단위로 잘라서 압축한다면 "2ab2cd2ab2cd"로 표현할 수 있습니다. 다른 방법으로 8개 단위로 잘라서 압축한다면 "2ababcdcd"로 표현할 수 있으며, 이때가 가장 짧게 압축하여 표현할 수 있는 방법입니다.</p>
27+
28+
<p>다른 예로, "abcabcdede"와 같은 경우, 문자를 2개 단위로 잘라서 압축하면 "abcabc2de"가 되지만, 3개 단위로 자른다면 "2abcdede"가 되어 3개 단위가 가장 짧은 압축 방법이 됩니다. 이때 3개 단위로 자르고 마지막에 남는 문자열은 그대로 붙여주면 됩니다.</p>
29+
30+
<p>압축할 문자열 s가 매개변수로 주어질 때, 위에 설명한 방법으로 1개 이상 단위로 문자열을 잘라 압축하여 표현한 문자열 중 가장 짧은 것의 길이를 return 하도록 solution 함수를 완성해주세요.</p>
31+
32+
<h3>제한사항</h3>
33+
34+
<ul>
35+
<li>s의 길이는 1 이상 1,000 이하입니다.</li>
36+
<li>s는 알파벳 소문자로만 이루어져 있습니다.</li>
37+
</ul>
38+
39+
<h5>입출력 예</h5>
40+
<table class="table">
41+
<thead><tr>
42+
<th>s</th>
43+
<th>result</th>
44+
</tr>
45+
</thead>
46+
<tbody><tr>
47+
<td><code>"aabbaccc"</code></td>
48+
<td>7</td>
49+
</tr>
50+
<tr>
51+
<td><code>"ababcdcdababcdcd"</code></td>
52+
<td>9</td>
53+
</tr>
54+
<tr>
55+
<td><code>"abcabcdede"</code></td>
56+
<td>8</td>
57+
</tr>
58+
<tr>
59+
<td><code>"abcabcabcabcdededededede"</code></td>
60+
<td>14</td>
61+
</tr>
62+
<tr>
63+
<td><code>"xababcdcdababcdcd"</code></td>
64+
<td>17</td>
65+
</tr>
66+
</tbody>
67+
</table>
68+
<h3>입출력 예에 대한 설명</h3>
69+
70+
<p><strong>입출력 예 #1</strong></p>
71+
72+
<p>문자열을 1개 단위로 잘라 압축했을 때 가장 짧습니다.</p>
73+
74+
<p><strong>입출력 예 #2</strong></p>
75+
76+
<p>문자열을 8개 단위로 잘라 압축했을 때 가장 짧습니다.</p>
77+
78+
<p><strong>입출력 예 #3</strong></p>
79+
80+
<p>문자열을 3개 단위로 잘라 압축했을 때 가장 짧습니다.</p>
81+
82+
<p><strong>입출력 예 #4</strong></p>
83+
84+
<p>문자열을 2개 단위로 자르면 "abcabcabcabc6de" 가 됩니다.<br>
85+
문자열을 3개 단위로 자르면 "4abcdededededede" 가 됩니다.<br>
86+
문자열을 4개 단위로 자르면 "abcabcabcabc3dede" 가 됩니다.<br>
87+
문자열을 6개 단위로 자를 경우 "2abcabc2dedede"가 되며, 이때의 길이가 14로 가장 짧습니다.</p>
88+
89+
<p><strong>입출력 예 #5</strong></p>
90+
91+
<p>문자열은 제일 앞부터 정해진 길이만큼 잘라야 합니다.<br>
92+
따라서 주어진 문자열을 x / ababcdcd / ababcdcd 로 자르는 것은 불가능 합니다.<br>
93+
이 경우 어떻게 문자열을 잘라도 압축되지 않으므로 가장 짧은 길이는 17이 됩니다. </p>
94+
95+
<hr>
96+
97+
<p>※ 공지 - 2024년 7월 8일 테스트케이스가 추가되었습니다. 기존에 제출한 코드가 통과하지 못할 수도 있습니다.</p>
98+
99+
100+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
public int solution(String s) {
3+
int answer = s.length();
4+
5+
int maxLength = s.length()/2;
6+
7+
for(int i =1; i <=maxLength; i++) {
8+
9+
String currentAnswer = "";
10+
int count = 1;
11+
String currentString = s.substring(0, i);
12+
for(int j = i; j < s.length(); j+=i) {
13+
String currentString2 = s.substring(j, Math.min(j + i, s.length()));
14+
if(currentString.equals(currentString2)) {
15+
count+=1;
16+
}
17+
else {
18+
if(count !=1) {
19+
currentAnswer += count;
20+
}
21+
currentAnswer += currentString;
22+
currentString = currentString2;
23+
count =1;
24+
}
25+
}
26+
27+
if (count != 1) currentAnswer += count;
28+
currentAnswer += currentString;
29+
if(currentAnswer.length() < answer) {
30+
answer = currentAnswer.length();
31+
}
32+
}
33+
34+
return answer;
35+
}
36+
}
37+
38+
// 1. 1개 자르는 것부터 n/2까지 진행
39+
// 2.

0 commit comments

Comments
 (0)