INCREASING THE DIFFICULTY | Leetcode Hash and Maps
- 아나그램 그룹화 (Grouping Anagrams): 주어진 문자열 배열에서 아나그램들을 그룹화하는 문제입니다. 🧩
- 핵심 아이디어: 각 문자열의 문자 빈도수를 계산하여 아나그램 여부를 판단합니다. 📊
- 빈도수 계산: 소문자(a-z)만 고려하여 26개 길이의 정수 배열을 생성하고, 각 문자의 아스키 코드에서 'a'의 코드를 빼서 0-25 범위의 인덱스로 사용해 빈도수를 증가시킵니다. 🔢
- 해시 맵 키 생성: 계산된 빈도수 배열을
toString() 메서드를 사용하여 고유한 문자열 키로 변환합니다. 🔑
- 해시 맵 활용:
Map<string, string[]>을 사용하여 빈도수 문자열을 키로, 해당 아나그램 문자열들을 값(배열)으로 저장합니다. 🗺️
- 결과 반환: 해시 맵의 값들(아나그램 그룹 배열)만 추출하여 최종 결과로 반환합니다. 📤
- 시간/공간 복잡도: N은 문자열 배열의 길이, M은 각 문자열의 최대 길이일 때 O(N * M)입니다. ⏱️
- 대안 솔루션 (소수 활용): 각 문자에 고유한 소수를 할당하고, 문자열의 모든 문자에 해당하는 소수들을 곱하여 고유한 '제품' 키를 생성하는 매우 빠른 방법도 소개됩니다. 🚀
- 상위 K개 빈번한 요소 (Top K Frequent Elements): 정수 배열에서 가장 빈번하게 나타나는 상위 K개의 요소를 반환하는 문제입니다. 🏆
- 빈도수 맵 생성:
Map<number, number>을 사용하여 각 숫자의 출현 빈도수를 계산합니다. (예: 1 -> 3, 2 -> 2, 3 -> 1) 📈
- 버킷 배열 활용:
nums.length 크기의 배열(버킷)을 생성하고, 인덱스를 빈도수로, 값을 해당 빈도수를 가진 숫자들의 배열로 사용합니다. (예: buckets[3] = [1], buckets[2] = [2]) 🪣
- 결과 추출: 버킷 배열을 가장 높은 빈도수(배열의 끝)부터 역순으로 탐색하여 K개의 요소를 수집합니다. ⬇️