https://leetcode.com/problems/group-anagrams/description/
처음에는 각 요소의 int 합으로 (sum += c - 'a') 애너그림인지 확인하려고 했다.
뭉청한 생각인건 다른 조합으로도 같은 sum이 나올 수 있다는 점을 생각 안 한 것이다.
따라서 정말 유일하게 식별할 수 있는게 필요한데,
아스키 문자별로 유일한 소수(prime)를 할당하고 이걸 기반으로 곱해서 sum을 만들어 비교할 수 있다. -> 이건 진짜 과하다 ㅋㅋ
가장 일반적인 길은 각 String 요소를 정렬해서 이것을 key로 해싱하는 것이다.
정렬했으니 같은 애너그램이면 같은 키를 쓰겠고, 그럼 그 요소를 리스트에 더해주면 된다.
이 문제도 일반성 (유니코드 등) 고려해서 해시 컬렉션 기반으로 풀었는데,
ASCII 문자 한정이라면 각 루프 안에서 체크하는 로직을 상수 시간으로 구할 수 있을 것 같기도 함 (현재는 정렬때문에 시간복잡도 +).
예를 들어 알파벳 소문자로 26자 한정이라면, 루프 돌면서 빈도수 체크해봤자 O(26)임
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
Map<String, List<String>> map = new HashMap<>();
for (String s : strs) {
char[] arr = s.toCharArray();
Arrays.sort(arr);
String key = new String(arr);
map.putIfAbsent(key, new ArrayList<>());
map.get(key).add(s);
}
return new ArrayList<>(map.values());
}
}