링크
내 풀이(O)
- 각 문자를 누르기 위한 최소값을 데이터로 정의하기 위해 dictionary를 사용
- 같은 문자면 가장 먼저 나왔을 때의 index를 사용하기 위해 거꾸로 뒤집어서 실행
- 이전 결과와 비교하였을 때 없거나 더 적은 숫자일 경우 dictionary를 업데이트 하도록 함
- 다소 코드가 복잡해짐
def solution(keymap, targets):
answer = []
minimum_key_dict = {}
for key in keymap:
key_dict = { k: len(key) - i for i, k in enumerate(reversed(key)) }
minimum_key_dict.update({ k: v for k, v in key_dict.items() if k not in minimum_key_dict or v < minimum_key_dict.get(k) })
for target in targets:
num = 0
for char in list(target):
if char not in minimum_key_dict:
num = -1
break
else:
num += minimum_key_dict.get(char)
answer.append(num)
return answer
다른 풀이
- 마찬가지로 각 문자를 누르기 위한 최소값을 데이터로 정의하기 위해 dictionary를 사용
- dictionary를 만들기 위한 코드가 간단
def solution(keymap, targets):
answer = []
hs = {}
for k in keymap:
for i, ch in enumerate(k):
hs[ch] = min(i + 1, hs[ch]) if ch in hs else i + 1
for i, t in enumerate(targets):
ret = 0
for ch in t:
if ch not in hs:
ret = - 1
break
ret += hs[ch]
answer.append(ret)
return answer
검증용 코드
keymaps = [["ABACD", "BCEFD"], ["AA"], ["AGZ", "BSSS"]]
targetss = [["ABCD","AABB"], ["B"], ["ASA","BGZ"]]
results = [[9, 4], [-1], [4, 6]]
for idx in range(len(results)):
print(idx, '성공' if solution(keymaps[idx], targetss[idx]) == results[idx] else "실패")