[프로그래머스] 문자열 압축 (Python, Java)
🔗 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/60057
👨🏻💻 작성한 코드 (Python)
def solution(s):
answer = len(s)
final_leng = 0
for leng in range(1, int(len(s)/2)+1):
result =''
start = 0
while start < (len(s)):
move = leng
count = 1
while s[start:(start+leng)] == s[(start+move):(start+move+leng)]:
move += leng
count += 1
if count > 1:
result += str(count) + s[start:(start+leng)]
elif len(s[start:]) < leng:
result += s[start: ]
else:
result += s[start:(start+leng)]
start += move
if len(result) < answer:
answer = len(result)
return answer
👨🏻💻 다른 사람의 풀이
def compress(text, tok_len):
words = [text[i:i+tok_len] for i in range(0, len(text), tok_len)]
res = []
cur_word = words[0]
cur_cnt = 1
for a, b in zip(words, words[1:] + ['']):
if a == b:
cur_cnt += 1
else:
res.append([cur_word, cur_cnt])
cur_word = b
cur_cnt = 1
return sum(len(word) + (len(str(cnt)) if cnt > 1 else 0) for word, cnt in res)
def solution(text):
return min(compress(text, tok_len) for tok_len in list(range(1, int(len(text)/2) + 1)) + [len(text)])
📊 결과 비교
내가 작성한 코드가 상대적으로 속도가 느림을 확인할 수 있었다.📝 결론
이번 문제의 경우는 처음 문제 설명에서 문제의 모든 조건에 대해 설명해 주지 않고 마지막 입출력 예제인 5번에서 문자열은 제일 앞부터 정해진 길이만큼잘라야 한다는 조건을 걸었다.
처음 문제 설명만 먼저 읽고 문제를 풀었던 나는 코드를 다 작성하고 나서야 이러한 제약조건이 있다는 것을 알게 되었고 그 후에 문제를 처음부터 다시 풀게 되었다.
다음부터는 문제를 풀기 직전 테스트 셋에 대한 설명까지 모두 읽으며 문제의 제약조건에 대해 모두 파악한 뒤 문제를 풀어야겠다는 교훈을 얻었다.
그리고 다른 사람의 코드와 비교하였을 때 여전히 속도가 느린 코드임을 확인할 수 있었다. 문제를 끝까지 읽는 것뿐만 아니라 코드의 효율성도 높게 작성하도록 더 노력해야겠다,
자바로 다시 풀이 (11월 4일)
👨🏻💻 작성한 코드 (Java)
class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
if (s.length() == 1) answer = 1;
for (int l=1; l<= s.length()/2; l++) {
StringBuilder sb = new StringBuilder();
int count = 1;
String previous = s.substring(0, l);
int i;
for (i=l; i<=s.length()-l; i+=l) {
String current = s.substring(i, i+l);
// 이전 문자와 같을 경우
if (previous.equals(current)) {
count++;
}
// 이전 문자와 다를 경우
else {
if (count != 1)
sb.append(count);
sb.append(previous);
previous = current;
count = 1;
}
// 마지막 문자일 경우
if (i > (s.length()-(l*2))) {
if (count != 1)
sb.append(count);
sb.append(previous);
sb.append(s.substring(i+l, s.length()));
}
}
if (answer > sb.length()) {
answer = sb.length();
}
}
return answer;
}
}
Author And Source
이 문제에 관하여([프로그래머스] 문자열 압축 (Python, Java)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@seongwon97/프로그래머스-문자열-압축-Python
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
class Solution {
public int solution(String s) {
int answer = Integer.MAX_VALUE;
if (s.length() == 1) answer = 1;
for (int l=1; l<= s.length()/2; l++) {
StringBuilder sb = new StringBuilder();
int count = 1;
String previous = s.substring(0, l);
int i;
for (i=l; i<=s.length()-l; i+=l) {
String current = s.substring(i, i+l);
// 이전 문자와 같을 경우
if (previous.equals(current)) {
count++;
}
// 이전 문자와 다를 경우
else {
if (count != 1)
sb.append(count);
sb.append(previous);
previous = current;
count = 1;
}
// 마지막 문자일 경우
if (i > (s.length()-(l*2))) {
if (count != 1)
sb.append(count);
sb.append(previous);
sb.append(s.substring(i+l, s.length()));
}
}
if (answer > sb.length()) {
answer = sb.length();
}
}
return answer;
}
}
Author And Source
이 문제에 관하여([프로그래머스] 문자열 압축 (Python, Java)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@seongwon97/프로그래머스-문자열-압축-Python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)