Skip to content

Commit 257032b

Browse files
committed
group anagram solution
1 parent b74daeb commit 257032b

File tree

1 file changed

+47
-0
lines changed

1 file changed

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

Comments
Β (0)