[파이썬 코딩테스트] 6.대충 만든 자판 - 프로그래머스

링크

내 풀이(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 "실패")

links

social