1+ import java .util .ArrayList ;
2+ import java .util .HashMap ;
3+ import java .util .List ;
4+ import java .util .Map ;
5+
6+ class SolutionGroupAnagram {
7+ public List <List <String >> groupAnagrams (String [] strs ) {
8+ // char, integer map으로 strs의 원소들을 분류한다
9+ // 분류 후 알파벳 순으로 정렬해 알파벳 + 개수 조합의 str으로 만든다
10+ // str 과 인덱스를 맵에 넣는다
11+ // 맵 keyset을 돌면서 value에 해당하는 strs 인덱스로 접근해 정답으로 반환
12+ // 시간복잡도: O(N), 공간복잡도: O(N)
13+ Map <String , List <Integer >> map = new HashMap <>();
14+
15+ for (int i =0 ; i <strs .length ; i ++) {
16+ var anagramData = createAnagramData (strs [i ]);
17+ var value = map .getOrDefault (anagramData , new ArrayList <>());
18+ value .add (i );
19+ map .put (anagramData , value );
20+ }
21+
22+ List <List <String >> answer = new ArrayList <>();
23+
24+ for (String key : map .keySet ()) {
25+ List <String > value = new ArrayList <>();
26+ for (int index : map .get (key )) {
27+ value .add (strs [index ]);
28+ }
29+
30+ answer .add (value );
31+ }
32+
33+ return answer ;
34+ }
35+
36+ private String createAnagramData (String str ) {
37+ Map <Character , Integer > map = new HashMap <>();
38+
39+ for (int i =0 ; i <str .length (); i ++) {
40+ var element = str .charAt (i );
41+ map .put (element , map .getOrDefault (element , 0 )+1 );
42+ }
43+
44+ var keySet = map .keySet ().stream ().sorted ().toList ();
45+ StringBuilder anagramData = new StringBuilder ();
46+ for (char key : keySet ) {
47+ anagramData .append (key ).append (map .get (key ));
48+ }
49+
50+ return anagramData .toString ();
51+ }
52+ }
0 commit comments