코테 오답노트

[프로그래머스] 대충 만든 자판 (파이썬, enumerate함수)

syveany 2025. 2. 27. 11:59

[문제]

대충 만든 천지인 자판으로 특정 문자열을 출력하려면 몇 번 자판을 눌러야 하는지 구하는 문제였다.

 

 

[코드]

def solution(keymap, targets):
    answer_lst = []
    apb = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    lst = [0] * 26
    
    # 각각의 알파벳에 접근할 수 있는 가장 빠른 인덱스 찾기
    for key in keymap:
        for i in range(len(key)):
            if lst[apb.index(key[i])] != 0:
                lst[apb.index(key[i])] = min(i+1, lst[apb.index(key[i])])
            else: 
                lst[apb.index(key[i])] = i+1
                
    # target 안의 알파벳에 접근하려면 자판을 몇 번 눌러야하는지 적기
    for target in targets:
        target_lst = []
        for i in target:
            target_lst.append(lst[apb.index(i)])
        answer_lst.append(target_lst)
	
    answer = []
    for list in answer_lst:
    	# target이 answer_lst에 존재하지 않는다면 무조건 -1 출력
        if 0 in list:
            answer.append(-1)
        # 존재한다면 모두 더해서 눌러야 하는 횟수 출력
        else:
            answer.append(sum(list))
    
    return answer

 

 

[아쉬운 점]

enumerate 함수 쓰면 더 예뻐질 수 있다.

인덱스와 값을 동시에 가져오는 함수이다.

fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits):
    print(index, fruit)
    
0 apple
1 banana
2 cherry

 

 

내 코드를 enumerate 함수를 사용해서 바꾸면 아래와 같이 간단해진다.

시간복잡도도 $O(N \times M)$에서 $O(N)$으로 줄어든다.

def solution(keymap, targets):
    key_dict = {}

    for key in keymap:
        for i, char in enumerate(key):
            if char in key_dict:
                key_dict[char] = min(key_dict[char], i + 1)
            else:
                key_dict[char] = i + 1

    answer = []
    
    for target in targets:
        total = 0
        for char in target:
            if char not in key_dict:
                total = -1
                break
            total += key_dict[char]
        answer.append(total)
    
    return answer

 

 

[느낀점]

자주 나오는 함수들은 반사적으로 쓸 수 있도록 익숙해져 놓자