Skip to content

Commit 08384c5

Browse files
committed
[level 2] Title: 문자열 압축, Time: 58.01 ms, Memory: 16.6 MB -BaekjoonHub
1 parent c3ed752 commit 08384c5

2 files changed

Lines changed: 148 additions & 0 deletions

File tree

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+
메모리: 16.6 MB, 시간: 58.01 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년 02월 14일 20:04: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: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import Foundation
2+
3+
func subString(_ from: Int, _ to: Int, _ s: String, _ count: Int) -> Substring.SubSequence {
4+
return s.suffix(count-from).prefix(to-from+1)
5+
}
6+
7+
func solution(_ s:String) -> Int {
8+
let wordSize = s.count
9+
if wordSize == 1 { return 1 }
10+
var answer = wordSize
11+
for windowSize in 1...(s.count/2) {
12+
var subCount = [Int]()
13+
var partialCount = 0
14+
var window = s.prefix(windowSize)
15+
for i in stride(from: 0, to: wordSize, by: windowSize) {
16+
let partialString = subString(i, i+windowSize-1, s, wordSize)
17+
if window == partialString {
18+
partialCount += 1
19+
}
20+
if (window != partialString) || ((i + windowSize) >= wordSize) {
21+
if partialCount > 1 {
22+
subCount.append(partialCount - 1)
23+
window = partialString
24+
partialCount = 1
25+
} else {
26+
window = partialString
27+
partialCount = 1
28+
}
29+
}
30+
}
31+
// 10 이상이면 줄이고, 2 더해야 함
32+
// 100 이상이면, 줄이고 3 더해야 함
33+
// go on,,,
34+
print(subCount)
35+
let subtract: Int = subCount.map {
36+
var digit = 1
37+
if $0+1 >= 10 { digit += 1 }
38+
if $0+1 >= 100 { digit += 1 }
39+
if $0+1 >= 1000 { digit += 1 }
40+
return $0*windowSize - digit
41+
}.reduce(0, +)
42+
answer = min(answer, wordSize - subtract)
43+
subCount = []
44+
partialCount = 0
45+
}
46+
47+
return answer
48+
}

0 commit comments

Comments
 (0)