[알고리즘] Leetcode_49_Group_Anagrams

jeongjwon·2023년 3월 22일
0

알고리즘

목록 보기
5/48

Problem


Solve

  1. 문자열 배열 strs 에서의 문자열 요소를 이루고 있는 문자 하나하나를 한 문자(charToStr)로 합쳐 분류하기 쉽게 사전식으로 정렬을 한다.
    (예, "eat" -> "e", "a", "t" -> "aet" )
  2. map 은 <구성하고 있는 사전식으로 정렬된 문자열 1개 = String 형, key값인 문자열을 가지고 새롭게 이루는 문자열 리스트 = List<String형>> 을 구성하기로 한다.
    2-1. map 에 key 가 있다면 map.get(charToStr) 의 리스트에 해당 str 을 추가하여 map 에 넣어준다.
    2-2. map 에 key 가 없다면 str 을 추가한 새로운 리스트를 map 에 추가한다.
  3. 리턴값은 같은 문자들을 가지는 조합의 문자열 리스트이다. 이는 map.values() 값과 같다.
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> result = new LinkedList<>();
        Map<String, List<String>> map = new HashMap<>();

        for(String str : strs){
            char[] chars = str.toCharArray();
            Arrays.sort(chars);
            String key = String.valueOf(chars);

            if(map.containsKey(key)){
                List<String> temp = map.get(charToStr);
                temp.add(str);
                map.put(key, temp);
            }else{
                List<String> temp = new LinkedList<>();
                temp.add(str);
                map.put(key, temp);
            }
        }

        for(List<String> value : map.values()){
            result.add(value);
        }

        return result;

    }
}

Refactoring

  1. 앞선 해결과정의 2에서 key가 map 에 포함되는지 여부에 대해 if/else 문을 이용하여 2-1 과 2-2를 거쳤다. 이를 더 효율적으로 하기 위해서 map에 key가 존재하지 않는 경우에만 새로운 리스트를 할당하여 map 에 추가하고, 동시적으로 map.get(key)의 리스트에 str 을 추가한다. 단지 8줄을 2줄로 줄인다.
if(!map.containsKey(key)) map.put(key, new LinkedList<>());
map.get(key).add(str);
  1. 리턴값을 새로운 result 에 값을 추가하기보다는 어차피 말 그대로 map.values()이기 때문에 이를 새로운 리스트로 할당해도 괜찮다.
return new LinkedList<>(map.values());

Key Point

String.valueOf(array) char 배열을 String 문자형으로 변환

0개의 댓글