리트코드,코드포스

[C++] Group Anagrams

앜지 2026. 7. 14. 21:51

https://leetcode.com/problems/group-anagrams/description/

 

Group Anagrams - LeetCode

Can you solve this real interview question? Group Anagrams - Given an array of strings strs, group the anagrams together. You can return the answer in any order.   Example 1: Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan

leetcode.com

 

Given an array of strings strs, group the anagrams together. You can return the answer in any order.

 

Example 1:

Input: strs = ["eat","tea","tan","ate","nat","bat"]

Output: [["bat"],["nat","tan"],["ate","eat","tea"]]

Explanation:

  • There is no string in strs that can be rearranged to form "bat".
  • The strings "nat" and "tan" are anagrams as they can be rearranged to form each other.
  • The strings "ate", "eat", and "tea" are anagrams as they can be rearranged to form each other.

Example 2:

Input: strs = [""]

Output: [[""]]

Example 3:

Input: strs = ["a"]

Output: [["a"]]

 

이전에 풀었던 Valid Anagram의 좀더 복잡한 버젼이다.

 

우선 생각나는 방식은 브루트 포스로 하나를 기준으로 순회하면서 일치하는 string은 하나의 벡터로 몰아넣고 erase하면 되지 않을까 했는데

 

class Solution {
public:
    bool isAna(string a, string b){
        sort(a.begin(),a.end());
        sort(b.begin(),b.end());
        return a == b;
    }
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> answer;
        for(auto it = strs.begin();it != strs.end();it++){
            vector<string>group;
            for(auto iter = it + 1;iter != strs.end();){
                if(isAna(*it, *iter)){
                    group.push_back(*iter);
                    iter = strs.erase(iter);
                }else{
                    iter++;
                }
            }
            group.push_back(*it);
            answer.push_back(group);
        }
        return answer;
    }
};

시간 초과떠서 뇌정지오긴 했다.

erase 쓰는게 좀 오바같긴 하다.같은거 있어도 O( n^2 )이고 다 달라도 O( n^2 )이니깐 

이후에 계속 째려보다가 30분째 유혹을 못이기고 지피티한테 물어봤다.

지피티는 그냥 해시맵을 써서 풀었다.

class Solution {
public:
    vector<vector<string>> groupAnagrams(vector<string>& strs) {
        vector<vector<string>> answer;
     unordered_map<string, vector<string>> mp;

    for (auto &s : strs) {
        string key = s;
        sort(key.begin(), key.end());

        mp[key].push_back(s);
    }
   for (auto &[k, v] : mp){
    answer.push_back(move(v));
    }
    return answer;
}
};

key를 정렬한 string으로 넣고 일치하면 넣고 아니면 새로 생성하면 되니깐.

 

리트코드는 보면 해시맵을 써서 푸는 문제가 많은거 같다. 애매하다~ 싶으면 해시맵부터 때려넣어보자.

 

여튼 보니깐 참 쉽다. 뇌가 꽤 맨들맨들한것 같지만 계속 풀어보자

'리트코드,코드포스' 카테고리의 다른 글

[C++] Valid Anagram  (0) 2026.07.11
[C++] Leetcode: Best Time to sell stock  (0) 2026.07.10
[C++]Leetcode: Two Sum  (0) 2026.07.06