2018 KAKAO BLIND RECRUITMENT 압축 파이썬
이번 문제는 레벨 2입니다.
접근방식(+오류코드)
- 문자의 길이가 0이 될 때까지 while 문을 반복합니다.
- 앞에서부터 한 자리씩 문자열을 비교하고, 존재한다면 인덱스를 append, 존재하지 않는다면 리스트에 append시킵니다.
- 핵심은 일치하는 문자열 중 가장 긴 문자열을 찾아야 하는데 이를 구현하는 것이 어려웠습니다.
- 결국, BE를 찾아야 할 순간에, B만을 일치하는 것으로 판단하여 2라는 인덱스를 리턴하게 되는 오류가 생겼습니다.
개인적인 오류 코드를 첨부하지만, 프로그래머스에서 가장 좋아요 개수가 많은 정답코드를 분석하도록 하겠습니다.
내 풀이(오답)
import string
def solution(msg):
aList = [0] + list(string.ascii_uppercase)
answer = []
status = True
while status:
if len(msg) == 0:
status = False
else:
max_val = 1
for i in range(1, len(msg)):
if msg[0:i] in aList:
max_val = max(max_val, i)
answer.append(aList.index(msg[0:max_val]))
aList.append(msg[0:max_val+1])
# print("msg", msg)
msg = msg[max_val:]
print("max", max_val)
print(aList)
# print("answer", answer)
# print("aList", aList)
# print("max_val", max_val)
return answer
print(solution('TOBEORNOTTOBEORTOBEORNOT'))
아래는 모범코드입니다.
모범코드
def solution(msg):
answer = []
# 아스키 코드를 활용해서 dict 생성
tmp = {chr(e + 64): e for e in range(1, 27)}
# 다음부터 append 될 초기 인덱스 지정
num = 27
# msg가 0가 될 때까지 반복
while msg:
tt = 1
# 입력값의 길이를 넘지 않을 때 까지 반복하는 조건문
while msg[:tt] in tmp.keys() and tt <= msg.__len__():
# 이 부분을 통해 최대 길이를 찾아낼 수 있습니다.
tt += 1
# 만약 key값에 존재하지 않는 것에서 끝난다면 이전 tt 값까지의 인덱스를 append
tt -= 1
if msg[:tt] in tmp.keys():
answer.append(tmp[msg[:tt]])
# 그냥 append를 하지 않고 key값과 value 값을 따로따로 지정해줍니다.
tmp[msg[:tt + 1]] = num
num += 1
msg = msg[tt:]
return answer
항상 느끼는 것이지만, 파이썬을 자유롭게 활용한 코드들은 로직이 정말 깔끔한 것 같습니다.
문제에서 주어지는 요구사항을 순차적으로 잘 구현하면 되는 문제들이 많음에도 불구하고,
그 결과물은 상당한 차이를 보입니다.
간결한 로직을 구성하고 그것을 구현할 수 있는 실력을 위해 노력하는 수 밖에 없다고 생각합니다.
알고리즘도 모든 것과 마찬가지로 꾸준한 연습과 이해를 바탕으로 실력이 향상합니다.
Just do it & Keep steady
댓글남기기