Skip to content

Commit d94bbc0

Browse files
Merge pull request #1611 from CodingTestStudy2/최원준
[최원준] Day27
2 parents 5157b99 + a1a962d commit d94bbc0

1 file changed

Lines changed: 50 additions & 0 deletions

File tree

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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)

0 commit comments

Comments
 (0)