-
문제 설명
제한 사항
입출력 예시 및 설명
내 풀이
def solution(keymap, targets): answer = [] dict={} for kmap in keymap: for i, k in enumerate(kmap): if k not in dict.keys(): dict[k] = [i] else: dict[k].append(i) cnt_list = [] for target in targets: cnt = 0 for k in target: if k not in dict.keys(): cnt = -1 break cnt += min(dict[k])+1 cnt_list.append(cnt) return cnt_list
처음에는 list로 풀려고 했는데, 그렇게 하면 for문이 너무 중첩이 돼서 시간초과가 날 것 같았다.
그래서 다른 방식으로 푸는 것을 고민해봤고, list가 아니라 dict로 풀면 되겠다! 생각을 함.
채점결과
아래는 enumerate를 사용하지 않고 dict를 만들어서 푼 풀이다.
다른 사람 풀이
def solution(keymap, targets): kdist = dict() for s in keymap : for i in range(len(s)) : kdist.setdefault(s[i],100) kdist[s[i]] = min(kdist[s[i]],i+1) ans = [] for s in targets : cnt = 0 flag=0 for i in range(len(s)) : if s[i] not in kdist : flag=1 break cnt += kdist[s[i]] if flag==1 : ans.append(-1) else : ans.append(cnt) return ans
어차피 target문자를 만드는데 key 문자의 최소 N번째만 사용할 것이기 때문에 키보드 문자의 모든 N번째를 다 저장할 필요가 없다. 저장할 때부터 최솟값만 저장하는 방식으로 푼 것.
enumerate 대신에 setdefault를 사용해서 100(키보드가 가질 수 있는 문자의 최대 수)으로 초기화를 해놓고, 문자의 최소 index로 바꿔주는 방식. 이렇게 문자와 index를 매칭시킴.
setdefault 설명
그러니까, dict에서 key값으로 val 값을 추출하는 과정에서 해당 key가 없다면 내가 지정한 val값을 출력하는 것이다. 근데 여기서 신기한 점은, 처음에 해당 key값이 없어서 내가 설정한 default값을 돌려준 후에 다시 dict을 확인해보면 key:default로 dict에 업데이트가 되어 있는 것! 앞으로 유용하게 사용할 수 있을 것 같다.
다른 사람 풀이 채점 결과
이 풀이 속도가 훨씬 빠르다!
enumerate를 사용하지 않아서 그런가?