[프로그래머스(Lv 1)/파이썬] 대충 만든 자판

jwKim·2023년 10월 21일
0

💻코테코테

목록 보기
35/42

📌 문제

아래 링크 참고

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

📌 풀이

코드

def solution(keymap, targets):
    answer = []

    al_dict = {chr(i) : -1 for i in range(ord('A'), ord('Z') + 1)} # 알파벳 딕셔너리 만들기

    # 알파벳 별로 출력을 위한 최소 횟수 업데이트
    for key in keymap :
        for k in key :
            if al_dict[k] == -1 : # 키가 처음 나왔을 때는 그 값으로 대체
                al_dict[k] = key.find(k) + 1
            else : # 두 번 이상 나왔을 때
                al_dict[k] = min(al_dict[k], key.find(k) + 1)

    for target in targets :
        num = 0
        for t in target :
            if al_dict[t] == -1 : # 자판에 없는 문자라면
                num = -1
                break
            else :
                num += al_dict[t]
        answer.append(num)

    return answer

설명

input으로는 알파벳만 받기 때문에 각 알파벳 별로 자판을 누르는 최소 값을 업데이트 한다. 그 후 target에서 누를 수 있는 자판이 있는지 확인하고 조건에 맞게 값을 출력한다.

추가 코드

def solution(keymap, targets):
    answer = []

    al_dict = {chr(i) : 101 for i in range(ord('A'), ord('Z') + 1)} # 알파벳 딕셔너리 만들기

    # 알파벳 별로 출력을 위한 최소 횟수 업데이트
    for key in keymap :
        for k in key :
			al_dict[k] = min(al_dict[k], key.find(k) + 1)

    for target in targets :
        num = 0
        for t in target :
            if al_dict[t] == 101 : # 자판에 없는 문자라면
                num = -1
                break
            else :
                num += al_dict[t]
        answer.append(num)

    return answer

첫 번째 코드와 달라진 점은 딕셔너리 초기화 값과 비교값이 -1에서 101로 바뀐 점이다. 왜 101로 넣냐면 keymap으로 받는 원소의 최대 길이가 100이기 때문이다.

만약 keymap에서 구현할 수 있는 문자열이 있다면, key.find(k)가 무조건 100보다는 작을 것이다. 그래서 min()을 할 때 그 알파벳이 처음 나온 알파벳인지 조건으로 제시하지 않아도 된다!!!!

이 스킬은 다른 문제에서도 얼마든 활용할 수 있으니 꼭 알아두자!

0개의 댓글