|
| 1 | +class Solution { |
| 2 | + func groupAnagrams(_ strs: [String]) -> [[String]] { |
| 3 | + // μ λκ·Έλ¨μ μ μ₯ν λμ
λ리 |
| 4 | + var groups = [String: [String]]() |
| 5 | + |
| 6 | + for str in strs { |
| 7 | + // κ°κ°μ λ¬Έμμ΄λ³λ‘ λ±μ₯νλ κΈμμ κ°―μλ₯Ό μ μ₯ν λμ
λ리 |
| 8 | + var occurences = [Character: Int]() |
| 9 | + |
| 10 | + // λ±μ₯νλ κΈμμ κ°―μλ₯Ό κ³μ° |
| 11 | + // Swiftμμλ κΈμλ₯Ό λ€λ£¨κΈ° μν΄ λ°°μ΄λ‘ λ³ννλ κ²μ΄ μ’μ |
| 12 | + for letter in Array(str) { |
| 13 | + if let val = occurences[letter] { |
| 14 | + occurences[letter] = val + 1 |
| 15 | + } else { |
| 16 | + occurences[letter] = 1 |
| 17 | + } |
| 18 | + } |
| 19 | + |
| 20 | + let anagramKey = makeAnagramKey(for: occurences) |
| 21 | + |
| 22 | + // λμ
λ리μ μ΄λ―Έ κ°μ μ λκ·Έλ¨ ν€κ° μ‘΄μ¬ν κ²½μ°, ν΄λΉ ν€μ λν κ°μ νμ¬ λ¬Έμμ΄ μΆκ° |
| 23 | + if let group = groups[anagramKey] { |
| 24 | + groups[anagramKey]!.append(str) |
| 25 | + } else { |
| 26 | + // λμ
λ리μ ν€κ° μ‘΄μ¬νμ§ μμ κ²½μ°, ν€λ₯Ό μΆκ°νκ³ νμ¬ λ¬Έμμ΄μ κ°μΌλ‘ μΆκ° |
| 27 | + groups[anagramKey] = [str] |
| 28 | + } |
| 29 | + } |
| 30 | + |
| 31 | + // λμ
λ리μ κ°λ€μ λ°°μ΄λ‘ λ°ν - λ°ν μμλ μκ΄μλ€κ³ λ¬Έμ μ λͺ
μ |
| 32 | + // λ°ν μμκ° νμν κ²½μ° μ λκ·Έλ¨ ν€μ λ±μ₯ μμλ₯Ό μ μ₯νλ λμ
λ리λ₯Ό μλ‘ λ§λ€ μ μμ |
| 33 | + return Array(groups.values) |
| 34 | + } |
| 35 | + |
| 36 | + // λ±μ₯νλ κΈμμ κ°―μμ λ°λΌ λμ
λ리μ ν€λ₯Ό λ§λλ ν¨μ |
| 37 | + func makeAnagramKey(for occurences: [Character: Int]) -> String { |
| 38 | + // κ°μ μ λκ·Έλ¨μ κ°μ§ λ κ°μ ν€λ₯Ό λ°ννκ² νκΈ° μν΄, μ λ ¬ μ μ© |
| 39 | + return occurences.keys.sorted().reduce("") { (previous, key) in |
| 40 | + var previous = previous |
| 41 | + previous += String(key) |
| 42 | + previous += String(occurences[key]!) |
| 43 | + |
| 44 | + return previous |
| 45 | + } |
| 46 | + } |
| 47 | +} |
0 commit comments