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