December 11, 2025
μ΄ λ¬Έμ λ μ£Όμ΄μ§ λ¬Έμμ΄κ³Ό μΈλ±μ€ μλ€μ μ΄μ©νμ¬, μΈλ±μ€ μμ ν΄λΉνλ λ¬Έμλ€μ μλ‘ κ΅νν μ μμ λ, μ¬μ μμΌλ‘ κ°μ₯ μμ λ¬Έμμ΄μ λ§λλ λ¬Έμ μ λλ€.
μ²μ μ΄ λ¬Έμ λ₯Ό μ κ·Όν λλ λ€μκ³Ό κ°μ΄ νμ΄λ³΄λ €κ³ νμ΅λλ€.
κ·Έλ¬λ μ΄λ° λ°©μμλ ν¬κ² λκ° λ¬Έμ κ° μμμ΅λλ€. μΌλ¨, 첫λ²μ§Έ λ¨κ³μμ νλμ μμ μ‘°ν©μ νλ² μ΄μ μ¬μ©ν μ μλ λ¬Έμ κ° μμμΌλ©°, λλ²μ§Έλ‘λ λλ²μ§Έ λ¨κ³κ° λ무 μ€λ 걸릴 κ²μΌλ‘ μμλλ μ μ΄μμ΅λλ€.
from itertools import permutations
class Solution:
def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
# find all possible orders
orders = [list(p) for p in permutations(pairs)]
print(orders)
# compare lexicographical orders
# naive brute force
lex_smallest_str = s
for order in orders:
curr_s = list(s)
for pair in order:
curr_s[pair[0]], curr_s[pair[1]] = curr_s[pair[1]], curr_s[pair[0]]
curr_s = ''.join(curr_s)
if curr_s < lex_smallest_str:
lex_smallest_str = curr_s
return lex_smallest_str
μμ μμλλ‘ νλ μ΄μμ μμ μ‘°ν©μ μ¬μ©ν κ²½μ° μ νν λ΅μ ꡬν μ μμ΅λλ€.
κ·Έλνλ‘ νννλ©΄ ν리λ λ¬Έμ λ€. μ κΈ°νκ² DFSλ‘ μλ‘ μ΄μ΄μ Έ μλ λ Έλλ€μ μ°Ύκ³ , μ΄λ κ² νμ κ²½μ° μλ‘ μννλ λ Έλλ€ κ°μ κ°μ₯ μμ λ¬Έμμ΄μ κ°κ° μ°Ύμμ ν΄λΉ μμΉμ λ£μ΄μ£Όλ©΄ λ©λλ€.
class Solution:
def smallestStringWithSwaps(self, s: str, pairs: List[List[int]]) -> str:
n = len(s)
graph = defaultdict(list)
for a,b in pairs:
graph[a].append(b)
graph[b].append(a)
visited = [False] * n
res = list(s)
def dfs(i,component):
visited[i] = True
component.append(i)
for neighbor in graph[i]:
if not visited[neighbor]:
dfs(neighbor, component)
for i in range(n):
if not visited[i]:
component = []
dfs(i, component)
chars = [s[j] for j in component]
chars.sort()
component.sort()
for idx,char in zip(component, chars):
res[idx] = char
return ''.join(res)
Constraints:
1 <= s.length <= 10^5
0 <= pairs.length <= 10^5
0 <= pairs[i][0], pairs[i][1] < s.length
s only contains lower case English letters.