◈ 오류 정정 및 피드백 환영
코딩테스트 연습 - [3차] 압축
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
programmers.co.kr
🔎문제 분석
ASCII 코드를 활용하면 사전은 간단하게 구현할 수 있다. A부터 Z는 65부터 90에 해당한다.
dic = dict(zip([chr(i) for i in range(65, 91)],list(range(1,27))))
현재 입력이 2개 이상의 문자열이 될 수 있기 때문에 문장의 글자를 하나씩 인덱싱하면 안 된다.
i = 0
while i<len(msg):
w = msg[i]
대신 다음과 같이 사전에 없는 글자가 나올 때까지 추가해야 한다.
만약 현재 입력이 사전에 없다면 사전에 추가하고 현재 입력을 빈 문자열로 초기화한다.
i = 0
w = ""
idx = 26
while i<len(msg):
w += msg[i]
if w in dic.keys():
i += 1
else:
idx += 1
dic[w] = idx
w = ""
현재 입력이 사전에 있더라도 무조건 현재 입력의 색인 번호를 출력할 수 있는 것은 아니다. 조건은 다음과 같다.
- 다음 글자를 인덱싱해야 하므로 현재 입력은 문장의 마지막 글자가 아니어야 한다
- 현재 입력의 다음 글자까지 포함한 문자열이 사전에 없어야 한다.
if w in dic.keys():
if i<len(msg)-1:
if w+msg[i+1] not in dic.keys():
answer.append(dic.get(w))
i += 1
🤦♀️유의 사항
현재 입력이 문장의 마지막 한 글자일 경우에는 처리되지 않은 다음 글자가 없는 셈이므로 위에서 언급한 조건에서 어긋나 출력을 하지 않게 된다. 따라서 while문이 종료된 이후 별도로 출력해줘야 한다.
while i<len(msg):
# 생략
answer.append(dic.get(w))
def solution(msg):
dic = dict(zip([chr(i) for i in range(65, 91)],list(range(1,27))))
answer = []
i = 0
w = ""
idx = 26
while i<len(msg):
w += msg[i]
if w in dic.keys():
if i<len(msg)-1:
if w+msg[i+1] not in dic.keys():
answer.append(dic.get(w))
i += 1
else:
idx += 1
dic[w] = idx
w = ""
answer.append(dic.get(w))
return answer
'Algorithm > Python' 카테고리의 다른 글
[Python] 프로그래머스 - [3차] n진수 게임(재귀) (0) | 2022.03.15 |
---|---|
[Python] 프로그래머스 - [1차] 셔틀버스 (0) | 2022.03.14 |
[Python] 프로그래머스 - [3차] 방금그곡 (0) | 2022.03.12 |
[Python] 프로그래머스 - [1차] 프렌즈4블록 (0) | 2022.03.11 |
[Python] 프로그래머스 - 키패드 누르기 (0) | 2022.03.10 |
댓글