File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 1+ #
2+
3+ '''
4+ 1. 아이디어 :
5+ ring의 각 문자가 등장하는 인덱스들을 미리 저장한다.
6+ 현재 ring 위치(pos)와 현재 key 위치(index)를 상태로 두고, dfs(pos, index)가 남은 key를 완성하는 최소 비용을 반환하게 한다.
7+ key[index]가 등장하는 모든 위치(next_pos)를 후보로 보며, 현재 위치에서 해당 위치까지의 최소 회전 거리와 버튼 클릭 1회를 더한다.
8+ 같은 상태는 반복될 수 있으므로 메모이제이션으로 저장하고, 모든 후보 중 최소값을 선택한다.
9+
10+ 2. 시간복잡도 :
11+ O(n * m^2) n = key, m = ring
12+
13+ 3. 자료구조/알고리즘 :
14+ dfs, memoization
15+
16+ '''
17+
18+ from collections import defaultdict
19+ class Solution :
20+ def findRotateSteps (self , ring : str , key : str ) -> int :
21+ n = len (ring )
22+ ring_dict = defaultdict (list )
23+ ring_list = []
24+
25+ for i , char in enumerate (ring ):
26+ ring_list .append (char )
27+ ring_dict [char ].append (i )
28+
29+ # print(ring_list)
30+ # print(ring_dict)
31+
32+
33+ @lru_cache (None )
34+ def dfs (pos , index ):
35+ if index == len (key ):
36+ return 0
37+
38+ ans = float ('inf' )
39+ target_char = key [index ]
40+
41+ for next_pos in ring_dict [target_char ]:
42+ diff = abs (pos - next_pos )
43+ rotate_cost = min (diff , n - diff )
44+
45+ ans = min (
46+ ans , rotate_cost + 1 + dfs (next_pos , index + 1 )
47+ )
48+ return ans
49+
50+ return dfs (0 , 0 )
You can’t perform that action at this time.
0 commit comments