첫번째 코드
문제를 읽어보고 내가 먼저 든 생각은 "이 문제를 제약이 없는 일반화된 상태에서도 풀 수 있도록 만들고 싶다"는 것이었다.
그렇기 때문에 가장 먼저 생각난 것은 1. 문자별로 눌러야 하는 최소의 숫자를 딕셔너리 형태로 저장하자는 것이었다.
그 후에 2. targets의 문자를 딕셔너리에서 찾아 정답을 구하는 방식이었다.
1. 문자별로 눌러야 하는 최소의 숫자를 딕셔너리 형태로 저장하기
- 빈 딕셔러니(key_dict)를 만든다
- keymap의 모든 단어들과 알파벳들을 거쳐가면서 최소(min)의 눌러야 하는 값을 비교하면서 값으로 저장한다.
2. targets의 문자를 찾아 정답 구하기
- targets의 단어들을 거치기 위해 각 단어별로 최소한으로 눌러야 하는 값 now_answer = 0으로 초기화한다.
- key_dict의 키 값에 해당 알파벳이 있는 경우 key의 value값을 불러와 now_answer에 최소로 눌러야 하는 숫자를 더한다.
- 만약 키 값에 해당 알파벳이 없는 경우 만들 수 없는 단어가 되어 now_answer = 0으로 한 후 break를 하여 더 볼 필요가 없다.
- 만약 now_answer이 0이 아니라면 만들 수 있는 문자열의 최소로 눌러야하는 수가 되므로 answer에 append한다.
- 만약 now_answer가 0이라면 만들 수 없는 문자가 되므로 -1을 answer에 append하도록 한다.
최종 답안인 answer을 보인다.
def solution(keymap, targets):
answer = []
key_dict = {}
for words in keymap:
for i in range(len(words)):
now = words[i]
if now in key_dict.keys():
key_dict[now] = min(i + 1, key_dict[now])
else:
key_dict[now] = i+1
for target_words in targets:
now_answer = 0
for now_word in target_words:
if now_word in key_dict.keys():
now_answer += key_dict[now_word]
else:
now_answer = 0
break
if now_answer != 0:
answer.append(now_answer)
else:
answer.append(-1)
return answer
통과!
이전에 코딩 테스트 문제 풀어야지 했을때는 풀지 못했던 기억이 있는데,
그래도 나름 내공이 쌓인건가 알고리즘이 없는 문제는 뚝딱 잘 푸네!