[프로그래머스] 대충 만든 자판 (Python)

이솔·2024년 6월 28일

[프로그래머스] 대충 만든 자판

https://school.programmers.co.kr/learn/courses/30/lessons/160586


문제 설명

· 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀜

· 1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 keymap과 입력하려는 문자열들이 담긴 문자열 배열 targets가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 반환

정리하면 주어진 문자열 target을 keymap의 key를 여러번 눌러서 만들 때, 눌러야하는 최소 횟수를 계산하는 문제


접근 방법

· target은 알파벳 대문자로만 이루어져 있으므로, keymap을 바탕으로 알파벳당 최소 눌러야 하는 횟수를 Dict에 저장

· target의 각 문자를 Dict의 인덱스로 넣어줌으로써 최소 눌러야 하는 횟수 반환, 합계 구하기

· keymap에 없는 문자는 만들 수 없으므로, Dict에 저장되어 있지 않은 문자가 있을 시 -1을 저장하고 다음 target 으로 넘어감


알고리즘 설계 및 구현

def solution(keymap, targets):
    # 키맵에서 각 문자에 대한 최소 키 누름 수를 저장할 딕셔너리 초기화
    key_dict = dict()
    # 각 타겟 문자열에 대한 결과를 저장할 리스트 초기화
    result = []
    
    # 각 키맵 문자열을 순회
    for key in keymap:
        # 각 문자열의 문자와 해당 인덱스를 순회
        for i, c in enumerate(key):
            # 문자가 딕셔너리에 없거나 현재 인덱스가 더 작을 경우 업데이트
            if c not in key_dict.keys() or i < key_dict[c]:
                key_dict[c] = i + 1  # 인덱스는 0부터 시작하므로, 1을 더해 키 누름 수로 저장

    # 각 타겟 문자열을 순회
    for target in targets:
        # 타겟 문자열에 대한 키 누름 수 합계 초기화
        sum = 0
        # 타겟 문자열의 각 문자를 순회
        for c in target:
            # 문자가 딕셔너리에 없으면 입력 불가능하므로 -1로 설정하고 루프 종료
            if c not in key_dict:
                sum = -1
                break
            else:
                # 키 누름 수 합계에 현재 문자의 키 누름 수를 더함
                sum += key_dict[c]
        # 타겟 문자열에 대한 결과를 리스트에 추가
        result.append(sum)
        
    # 최종 결과 리스트 반환
    return result

결과


최적화 및 개선 방안

· sum과 같은 변수명은 내장함수와 이름이 겹치기 때문에 변수이름 신경써서 지을 것

0개의 댓글