[Programmers][Py] 대충 만든 자판

mj·2024년 7월 29일
0

코딩테스트문제

목록 보기
40/50
post-custom-banner

✅ 문제

문제 바로가기



✅ 나의 풀이

  • 구해야 하는 것 : 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지를 순서대로 담은 배열
    따라서, 각 알파벳을 입력할때 최소로 눌러야 하는 횟수를 알아야 한다.

알고리즘

  1. 알파벳마다 최소 입력 횟수를 계산하여 딕셔너리 변수 dic에 저장한다.
  2. target 문자열의 최소입력횟수 구하기
    한글자씩 순회하며 dic에서 가져온 최소 횟수를 더하여 결과값을 만든다.

딕셔너리 변수 dic

  • 각 알파벳마다 최소로 눌러야 하는 횟수를 딕셔너리에 저장하도록 하였다.
  • 알파벳마다 값을 0으로 초기화해둔다.
  • 자판에 해당 키가 없는 경우(문자열을 입력할 수 없는 경우)는 딕셔너리의 값을 0으로 한다. ex) {"A": 0}

def solution(keymap, targets):
    dic = {"A":0, "B":0, "C":0, "D":0, "E":0, "F":0, "G":0, "H":0, "I":0, "J":0, "K":0, "L":0, "M":0, "N":0, "O":0, "P":0, "Q":0, "R":0, "S":0, "T":0, "U":0, "V":0, "W":0, "X":0, "Y":0, "Z":0}
    answer = []
    
    # 알파벳마다 최소 몇번 눌러야 하는지 딕셔너리에 저장
    for str in keymap:
        for idx, char in enumerate(str):
            if dic[char] == 0: 
                dic[char] = idx + 1
            else:
                dic[char] = min(dic[char], idx + 1)
    
    # target 문자열 최소 몇번 눌러야 하는지 계산하기
    for target in targets:
        sum = 0
        for char in target:
            if dic[char] == 0:
                answer.append(-1)
                break
            else:
                sum += dic[char]
        else:
            answer.append(sum)
    
    return answer



✅ 다른 풀이


def solution(keymap, targets):
    answer = []
    dic = {}
    for k in keymap:
        for i, ch in enumerate(k):
            dic[ch] = min(i + 1, dic[ch]) if ch in dic else i + 1

    for target in targets:
        sum = 0
        for ch in target:
            if ch not in dic:
                sum = - 1
                break
            sum += dic[ch]
        answer.append(sum)

    return answer

나의 풀이와 다른 점

나의 풀이

먼저 dic을 직접 선언해두고 시작함. 모든 알파벳을 직접 0으로 초기화시킴.

다른 풀이

dic에 있는 알파벳이면 값을 업데이트 시키고, dic에 없다면 새로 추가하며 딕셔너리를 완성시킨다.
in 연산자를 사용하여 dic에 있는지 없는지 확인한다.

Comment

딕셔너리에서의 in 연산자를 생각하지 못해 모든 알파벳을 직접 선언하는 방식으로 구현하였다. 만약, 테스트 상황에서라면 시간을 아껴야 하므로 직접 하나하나 선언하기보다는 후자의 방법으로 하는 것이 맞을것 같다.

profile
일단 할 수 있는걸 하자.
post-custom-banner

0개의 댓글