< All posts

1202. Smallest String With Swaps

문제 μ„€λͺ…

이 λ¬Έμ œλŠ” μ£Όμ–΄μ§„ λ¬Έμžμ—΄κ³Ό 인덱슀 μŒλ“€μ„ μ΄μš©ν•˜μ—¬, 인덱슀 μŒμ— ν•΄λ‹Ήν•˜λŠ” λ¬Έμžλ“€μ„ μ„œλ‘œ κ΅ν™˜ν•  수 μžˆμ„ λ•Œ, μ‚¬μ „μˆœμœΌλ‘œ κ°€μž₯ μž‘μ€ λ¬Έμžμ—΄μ„ λ§Œλ“œλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

1202

풀이 및 ν•΄μ„€

처음 이 문제λ₯Ό μ ‘κ·Όν•  λ•ŒλŠ” λ‹€μŒκ³Ό 같이 풀어보렀고 ν–ˆμŠ΅λ‹ˆλ‹€.

  1. λͺ¨λ“  μˆœμ„œ 쑰합을 찾아보고
  2. ν•˜λ‚˜μ”© λ¬Έμžμ—΄μ„ κ΅ν™˜ν•΄λ³Έ ν›„ κ°€μž₯ μž‘μ€ λ¬Έμžμ—΄μ„ μ°ΎλŠ” λ°©μ‹μž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ 이런 λ°©μ‹μ—λŠ” 크게 λ‘κ°œ λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 일단, 첫번째 λ‹¨κ³„μ—μ„œ ν•˜λ‚˜μ˜ μˆœμ„œ 쑰합을 ν•œλ²ˆ 이상 μ‚¬μš©ν•  수 μžˆλŠ” λ¬Έμ œκ°€ μžˆμ—ˆμœΌλ©°, λ‘λ²ˆμ§Έλ‘œλŠ” λ‘λ²ˆμ§Έ 단계가 λ„ˆλ¬΄ 였래 걸릴 κ²ƒμœΌλ‘œ μ˜ˆμƒλ˜λŠ” μ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ‹œλ„ 1

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

try1

μ—­μ‹œ μ˜ˆμƒλŒ€λ‘œ ν•˜λ‚˜ μ΄μƒμ˜ μˆœμ„œ 쑰합을 μ‚¬μš©ν•  경우 μ •ν™•ν•œ 닡을 ꡬ할 수 μ—†μŠ΅λ‹ˆλ‹€.

μ‹œλ„ 2

κ·Έλž˜ν”„λ‘œ ν‘œν˜„ν•˜λ©΄ ν’€λ¦¬λŠ” λ¬Έμ œλ‹€. μ‹ κΈ°ν•˜κ²Œ DFS둜 μ„œλ‘œ 이어져 μžˆλŠ” λ…Έλ“œλ“€μ„ μ°Ύκ³ , μ΄λ ‡κ²Œ ν–ˆμ„ 경우 μ„œλ‘œ μˆœνšŒν•˜λŠ” λ…Έλ“œλ“€ κ°„μ˜ κ°€μž₯ μž‘μ€ λ¬Έμžμ—΄μ„ 각각 μ°Ύμ•„μ„œ ν•΄λ‹Ή μœ„μΉ˜μ— λ„£μ–΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

try2

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)

Complexity Analysis

tc

μ‹œκ°„ λ³΅μž‘λ„

  • O(N + M log M) : N은 λ¬Έμžμ—΄μ˜ 길이, M은 각 ν΄λ”μ˜ μ΅œλŒ€ 길이

곡간 λ³΅μž‘λ„

  • O(N + M) : N은 λ¬Έμžμ—΄μ˜ 길이,

Constraint Analysis

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.

References

Β© 2025 HyunJoon Sung. All Rights Reserved.

GitHub