[문제]
대충 만든 천지인 자판으로 특정 문자열을 출력하려면 몇 번 자판을 눌러야 하는지 구하는 문제였다.
[코드]
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
[느낀점]
자주 나오는 함수들은 반사적으로 쓸 수 있도록 익숙해져 놓자
'코테 오답노트' 카테고리의 다른 글
[프로그래머스] 옹알이(2) (파이썬, startswith 함수) (0) | 2025.03.04 |
---|---|
[프로그래머스] 햄버거 만들기 (파이썬, 시간초과) (0) | 2025.03.03 |
[프로그래머스] 숫자 짝꿍 (파이썬, 시간복잡도 개선) (0) | 2025.02.26 |
[프로그래머스] 평행 (파이썬) (0) | 2025.02.24 |
[프로그래머스] 겹치는 선분의 길이 (파이썬) (0) | 2025.02.24 |