String 배열 strs 이 주어지면 아나그램끼리 그룹화하라.
Example 1:
Input: strs = ["eat","tea","tan","ate","nat","bat"]
Output: [["bat"],["nat","tan"],["ate","eat","tea"]]
Example 2:
Input: strs = [""]
Output: [[""]]
Example 3:
Input: strs = ["a"]
Output: [["a"]]
해당 문제는 생각과 코드 구현이 미숙하여 검색과 gpt 의 도움을 받음
public List<List<String>> groupAnagrams(String[] strs) { // ["eat","tea","tan","ate","nat","bat"]
Map<String, List<String>> map = new HashMap<>(); // 결과를 담을 해시맵 생성
for (String s : strs) { // 하나 꺼내
char[] characters = s.toCharArray(); // 한글자씩 잘라
Arrays.sort(characters); // 배열에 담아 "eat" -> ['a', 'e', 't']
String sorted = new String(characters); // 배열을 글자로 만들어 ['a', 'e', 't'] -> "aet"
if (!map.containsKey(sorted)) { // 만들어진 글자가 맵에 키로 없다면
map.put(sorted, new ArrayList<>()); // (만들어진 글자, 새 배열) 을 맵에 넣어
}
map.get(sorted).add(s); // 만들어진 글자가 맵에 키로 이미 있으면, value 배열에 s 를 넣어
}
// 해시맵의 value 를 리스트로 반환
return new ArrayList<>(map.values()); // [["bat"], ["nat", "tan"], ["ate", "eat", "tea"]]
}
public List<List<String>> groupAnagrams2(String[] strs) {
// 각 키에 대한 문자열 리스트를 저장하기 위한 해시맵
Map<String, List<String>> map = new HashMap<>();
// 1. ["eat","tea","tan","ate","nat","bat"] 에서 eat 을 꺼내
for (String s : strs) {
int[] count = new int[26];
// 2. eat 의 알파벳을 하나하나 카운트해서 배열로 저장 > a:1, e:1, t:1
for (char c : s.toCharArray()) {
count[c - 'a']++;
}
// 3. 카운트 배열을 순회하며, 요소가 0이 아닐때(즉, 카운트된게 있을 때) 그 알파벳과 갯수를 문자열에 추가 > e1a1t1 > 이걸 키로 사용
StringBuilder sb = new StringBuilder("");
for (int i = 0; i<count.length; i++) {
if (count[i] != 0) {
sb.append((char) (i + 'a'));
sb.append(count[i]);
}
}
String key = sb.toString();
// 4. 해시맵에 키가 없으면 (e1a1t1, 새로운 ArrayList)
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
} map.get(key).add(s); // 5. 해당 키를 조회해서 value 에 eat 단어 추가
}
// 5. 해시맵에 저장된 아나그램 value 배열을 반환
return new ArrayList<>(map.values());
}
toString()
을 통해 문자열로 변환할 수 있음.