(String, Easy) Group Anagrams

송재호·2025년 8월 8일
0

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());
    }
}
profile
식지 않는 감자

0개의 댓글