49. Group Anagrams

  • μ£Όμ–΄μ§„ λ¬Έμžμ—΄ λ°°μ—΄ strs 에 λŒ€ν•΄μ„œ μ„œλ‘œ anagram인 관계인 λ¬Έμžμ—΄λΌλ¦¬ λ¬Άμ–΄μ„œ set을 λ§Œλ“€κ³  κ·Έ set의 λͺ©λ‘μ„ λŒλ €μ£ΌλŠ” 문제.
  • 두 λ¬Έμžμ—΄μ΄ anagramμ΄λΌλŠ” 것은 각 μ•ŒνŒŒλ²³μ˜ μΆœν˜„ λΉˆλ„κ°€ λ™μΌν•˜λ‹€λŠ” λœ»μ΄λ‹€.
  • λ”°λΌμ„œ 각 κΈ€μžκ°€ λ™μΌν•œ λΉˆλ„λ‘œ μΆœν˜„ν•œ λ¬Έμžμ—΄λΌλ¦¬ 묢으면 λ˜λŠ” λ¬Έμ œμ΄λ‹€.
  • λ‹€λ§Œ λ™μΌν•œ μΆœν˜„ λΉˆλ„μž„μ„ λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œ uniqueν•œ keyλ₯Ό λ§Œλ“€μ–΄μ•Ό ν•˜λŠ”λ° 이 λ•Œ 더 효율적인 방법을 μ°ΎλŠ” 것이 ν•„μš”ν•˜λ‹€.
    • λ‹¨μˆœνžˆ integerλ₯Ό λ¬Έμžμ—΄λ‘œ λ°”κΏ”μ„œ κ΅¬λΆ„μžλ‘œ joinν•˜λŠ” 방법도 μžˆκ² μ§€λ§Œ μ•„λž˜ ν’€μ΄μ—μ„œλŠ” byte arrayλ₯Ό ν™œμš©ν•˜μ—¬ keyλ₯Ό λ§Œλ“€μ—ˆλ‹€.
    • μ΄λŠ” 각 λ¬Έμžμ—΄μ˜ 길이가 100μ΄ν•˜μΈ 점을 μ΄μš©ν•œ 것이닀 (μ΅œλŒ€ μΆœν˜„ λΉˆλ„κ°€ 100μ΄λ―€λ‘œ byte λ²”μœ„λ‚΄μ— λ“€μ–΄μ˜€κ²Œ λœλ‹€).
class Solution { String toHashKey(String s) { byte[] counter = new byte['z' - 'a' + 1]; for (int i = 0; i < s.length(); ++i) { ++counter[s.charAt(i) - 'a']; } try { return new String(counter, "UTF-8"); } catch (Exception e) { return ""; } } public List<List<String>> groupAnagrams(String[] strs) { int n = strs.length; Map<String, List<String>> map = new HashMap<>(); for (int i = 0; i < n; ++i) { String key = toHashKey(strs[i]); List<String> set = map.computeIfAbsent( key, (_) -> new ArrayList<String>()); set.add(strs[i]); } return new ArrayList<>(map.values()); } }