[프로그래머스] Lv.2 압축
문제 이해 : 4분 + 4분
문제 풀이 : 45분(실패)
틀린 풀이
def solution(msg):
d = {}
for i in range(26):
d[chr(i+65)] = i+1
answer = []
tmp = ''
for i in range(len(msg)):
tmp += msg[i]
while True:
for j in msg[i+1:]:
print(tmp)
if tmp in d:
if d[tmp] in answer:
tmp += j
else:
# yes
answer.append(d[tmp])
tmp += j
else:
# no
d[tmp] = len(d)+1
tmp = ''
break
break
print(d)
return answer
생각한 과정
1. 문자가 하나인 경우는 무조건 딕셔너리에 있다.
2. 문자가 두개 이상인 경우를 검사할 경우 딕셔너리에 있으면, 문자를 하나 더 추가해 테스트를 다시 진행한다.
2-1 딕셔너리에 없으면 딕셔너리에 새로운 문자열 추가, 현재까지의 문자열을 정답에 추가
정답에 가까운 문자열은 나왔지만 문자열 중간중간 맞지 않는 형태의 결과값이 나왔다.
이부분에 대한 원인 탐색이 제대로 되지 못한 것이 실패요인! 왜 검새 순서가 k, ka, a, ak, k, ka, kao, a, ao, o
여기서 빨간 부분은 왜 검사를 안했을까에 대한 의문을 가졌다면 위와 같은 풀이는 안나왔을지도 모른다.
정답 풀이
def solution(msg):
d = {}
for i in range(26):
d[chr(i+65)] = i+1
answer = []
w = 0
c = 0
while True:
c += 1
if c == len(msg):
answer.append(d[msg[w:c]])
break
if msg[w:c+1] not in d:
d[msg[w:c+1]] = len(d) + 1
answer.append(d[msg[w:c]])
w = c
return answer
w와 c를 활용해 슬라이싱을 해준 것이 인상적이었다.
어디서 시작해야 하는지, 어디서 끝나는 지 그런 구간 설정들을 잘 처리해주는 것이 문자열에서는 가장 중요한 것 같다.
항상 for문을 활용해 왼족부터 오른쪽이 아니라,
조건문, 여러 변수를 직접 사용해 다소 불규칙해보이는 문자열을 처리해주는 방법도 있다.
그러니 너무 순순히 문제를 풀려 하지 말자 ㅋㅋㅋㅋ
while문 활용, 슬라이싱, 조건문을 사용한 부분은 합격! 이제는 디테일이 필요하다.
디테일은 어떻게 잡을까? 결국 손으로 계획을 세우는 단계에서 예시를 매우 잘 이해해야 풀 수 있다.
나는 이런 예시 부분을 코딩하면서 보지 뭐 시간없으니까 이런 식으로 생각했기 때문에 아주 잘 망한 것 같다. ㅎㅎㅎ
그러니 최대한 생각을 더 해보고 코드를 짜는 건 나의 실력을 믿자. 이제 나 코딩 잘한다고!!!
어떤 코딩테스트에서는 예시를 제공해주지도 않으니 더욱 유의하자