# 연관 링크
- [문제 풀이 스케줄](https://github.com/orgs/DaleStudy/projects/6/views/5)
- [답안 코드 제출법](https://github.com/DaleStudy/leetcode-study/wiki/%EB%8B%B5%EC%95%88-%EC%A0%9C%EC%B6%9C-%EA%B0%80%EC%9D%B4%EB%93%9C)

# Problem
- 문제 링크 : https://leetcode.com/problems/group-anagrams/description/
- 문제 이름 : Group Anagrams
- 문제 번호 : 49
- 난이도 : medium
- 카테고리 :

# 문제 설명


# 아이디어
- string을 정렬 -> key로 사용 가능
  - 정렬을 이용해 서로 다른 permutation(anagram)들을 같은 그룹으로 묶음.
- unordered_map을 사용해서 key lookup이 평균적으로 **O(1)**에 가능하므로 전체 알고리즘은 매우 효율적임.

# ✅ 코드 (Solution)
```
class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> res;
        unordered_map<string, vector<string>> um;
        for(auto str: strs){
            string key= str;
            sort(key.begin(), key.end());
            um[key].push_back(str);
        }
        for(auto vec = um.begin();vec != um.end(); vec++){
            res.push_back(vec->second);
        }
        return res;
    }
};

```
# 🔍 코드 설명
- length가 10^4 이하 + sort -> input 상 상수 시간 내 처리 가능
    - 정렬을 이용해 서로 다른 permutation(anagram)들을 같은 그룹으로 묶음.
- unordered_map을 사용해서 key lookup이 평균적으로 **O(1)**에 가능하므로 전체 알고리즘은 매우 효율적임.
- 

# 최적화 포인트 (Optimality Discussion)
- 불필요한 문자열 복사 방지:
  - for(auto& str : strs) 처럼 auto 뒤에 &(레퍼런스) 를 사용하면, str을 복사하지 않고 참조로 받아 메모리 사용을 줄일 수 있음. 
- key string 생성 비용 줄이기:
  - 문자열을 매번 정렬하면 O(K log K) (K는 문자열 길이) 비용이 듦.
  - 만약 모든 입력 문자열이 영어 소문자(a~z)로 제한된다면, 26개 알파벳의 빈도수 배열을 사용해서 O(K)로 key를 만들 수도 있음.
  - 이 경우 정렬이 아니라 counting 기반 key 생성.

# 🧪 테스트 & 엣지 케이스

# 📚 관련 지식 복습

# 🔁 회고


