문제
https://school.programmers.co.kr/learn/courses/30/lessons/17684
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
우선 2번의 조건으로 인해서 문자열의 서브 문자열을 모두 검사해서 사전에 등재한 가장 긴 문자열이 존재하는지 검사하는 줄 알았다. 그러나 두번째 예시를 보니까 그냥 앞에서부터 검사하면 되는거였기에 맞게 구현하였다.
우선 dictionary 구조로 A ~ Z를 키로, 1 ~ 26 을 값으로 초기화 해준다.
이후에는 문자열 첫번째부터 검사하면 되는데 만약 KAKAO이고 내가 검사해야할 위치가 0 이면
K
KA
KAKA
KAKAO
를 검사하면서 사전에 key로 존재하는지 검사한다. 길어지는 순으로 검사하기에 가장 긴 문자열이 남게 될 것이다.
이후에 정답 배열에 문자열의 value 값을 추가해준다.
그 다음에는 key로 찾은 문자열 + 뒤의 문자 하나를 더해서 새로운 key값을 만들어 사전에 저장해준다.
K 일 경우, K를 지울필요는 굳이 없고 검사를 A부터 다시 시작하면 된다.
(만약 KA일 경우는 기존에 검사한곳에서 2만큼 띄워진곳부터 검사하는 식이다. 길이 만큼 인덱스를 이동해서 검사한다.)
코드
def initDict():
mydict = {}
dictIdx = 1
for alpha in range(65, 91):
mydict[chr(alpha)] = dictIdx
dictIdx += 1
return mydict, dictIdx
def solution(msg):
answer = []
myDict, dictIdx = initDict()
idx = 0
while True:
if idx >= len(msg): break
resultStr = ''
# 현재 문자에서 사전에 등재된 가장 긴 문자열을 찾는다.
for i in range(1, len(msg)+1-idx):
value = msg[idx:idx+i]
if value in myDict:
resultStr = value
# 정답 배열에 숫자를 추가해준다.
answer.append(myDict[resultStr])
if resultStr != '':
newStr = msg[idx:idx+len(resultStr)+1]
myDict[newStr] = dictIdx
dictIdx += 1
idx += len(resultStr)
return answer
후기
내가 굉장히 귀찮게 정의했던 딕셔너리 초기화를
myDic = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ", range(1,27)))
와 같이 한 것을 봤다. dictionary를 초기화 할 때는 항상 zip을 떠올려보자. 굉장히 깔끔해진다.
'프로그래머스' 카테고리의 다른 글
LV2 [KAKAO] [3차] 방금그곡 (0) | 2023.08.17 |
---|---|
LV2 [KAKAO] [1차] 캐시 (0) | 2023.08.16 |
LV2 [KAKAO] 튜플 (0) | 2023.08.14 |
LV2 [KAKAO] [1차] 프렌즈4블록 (0) | 2023.08.14 |
LV2 [KAKAO] [3차] 파일명 정렬 (0) | 2023.06.20 |