카카오 코테 2020 Lv2 문자열 압축 파이썬 풀이
https://programmers.co.kr/learn/courses/30/lessons/60057
정답코드
#문자열 압축
def solution(s):
answer = 1000
aliquot_list = []
answer_list = []
for i in range(1,len(s)//2 + 1):
aliquot_list.append(i)
#문자열이 1개일 때 예외처리
if(len(aliquot_list) == 0):
aliquot_list.append(1)
# print("list:",aliquot_list)
for i in aliquot_list:
j = 0
cnt = 0
answerchar = ""
check_char = s[:i]
# print("시작:",check_char)
while j+i <= len(s):
#out of index 를 조심하기 위해 범위 설정에 신경을 씀
if(check_char == s[j+i:j+i+i]):
cnt += 1
else:
if(cnt == 0):
answerchar += check_char
else:
answerchar += str(cnt+1)
answerchar += check_char
#cnt 초기화 및 check하는 부분 변경
check_char = s[j+i:j+i+i]
cnt = 0
#기차꼬리물듯이 체크
j += i
#약수가 아닌 경우에 꼬리 추가
if(len(s) % i != 0):
answerchar = answerchar + s[len(s)-len(s)%i:]
# print(answerchar)
answer_list.append(answerchar)
#최소값 넣기
for i in range(len(answer_list)):
# print(answer_list[i],"길이",len(answer_list[i]))
if(len(answer_list[i]) < answer):
answer = len(answer_list[i])
# print(answer)
return answer
풀이과정
첫번째 풀이 오류
#문자열 압축
def solution(s):
answer = 1000
aliquot_list = []
answer_list = []
for i in range(1,len(s)//2 + 1):
aliquot_list.append(i)
print("list:",aliquot_list)
for i in aliquot_list:
j = 0
cnt = 0
answerchar = ""
check_char = s[:i]
# print("시작:",check_char)
while j+i <= len(s):
#out of index 를 조심하기 위해 범위 설정에 신경을 씀
if(check_char == s[j+i:j+i+i]):
cnt += 1
else:
if(cnt == 0):
answerchar += check_char
else:
answerchar += str(cnt+1)
answerchar += check_char
#cnt 초기화 및 check하는 부분 변경
check_char = s[j+i:j+i+i]
cnt = 0
#기차꼬리물듯이 체크
j += i
# print(answerchar)
answer_list.append(answerchar)
#최소값 넣기
for i in range(len(answer_list)):
print(answer_list[i],"길이",len(answer_list[i]))
if(len(answer_list[i]) < answer):
answer = len(answer_list[i])
print(answer)
return answer
solution("abcabcdede")
길이 7 이 아니라 2abcdede 길이 8
길이 8이 아니라 2abcabcdede 길이 10
이 나와야하는데 짤려서 나온다. while 문 부분이 잘못된 것같다.
뒷부분이 생략되는 이유는 아래처럼 코드를 단위 별로 더해줬기 때문
따라서 마지막 부분에서 예외처리를 해줘야한다.
따라서 아래와 같은 코드를 추가해주었다.
#약수가 아닌 경우에 꼬리 추가
if(len(s) % i != 0):
answerchar = answerchar + s[len(s)-len(s)%i:]
예를 들어 i = 3 인경우 나머지는 1( 10 % 3 )이다.
따라서 s[len(s) - len(s)%i:] 는 [9:] 즉 채워지지 못했던 [e] 를 의미한다.
두번째 풀이 오류
하지만 이런 추가에도 불구하고 test 5 번에서 실패가 났다..
문자열 값이 1인경우 예를들어 'a' 하나인 경우 이런식으로 list에 값이 들어가지 않아 오류가 발생했다. 이는 range의 시작점 끝점이 모두 1로 같아 값이 입력되지 않기 때문이었다.
따라서 아래와 같은 예외 처리 코드를 입력하였다.
배울점 && 공부방향
1. 예외 처리에 취약하다.
-> 항상 0, 1 최대값 등 예외를 고려하면서 문제를 푸는 연습을 하자.
2.while 문에 익숙하지 않다.
-> 머리속으로 코드가 돌아가는 순서를 생각하고, 이를 노트에 직접 적어보면서 공부하자
'CS > 알고리즘' 카테고리의 다른 글
파이썬 1697번 숨바꼭질 파이썬 풀이 (0) | 2022.04.01 |
---|---|
파이썬 7569번 토마토 파이썬 풀이 (0) | 2022.03.31 |
백준 2178번 미로 탐색 파이썬 풀이 (0) | 2022.03.27 |
백준 1012번 유기농 배추 파이썬 풀이 (0) | 2022.03.26 |
백준 2667번 단지번호붙이기 파이썬 풀이 (0) | 2022.03.24 |