[Array & Hash] Group Anagrams

김예인·2023년 11월 15일
0

알고리즘 문제풀이

목록 보기
6/12

문제


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"]]

    }
  • 문자열을 정렬 후 정렬된 문자열을 key 로 해시맵 활용

다른 풀이

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());

    }
  • 문자열의 알파벳 갯수를 카운트하여 일치하는 값끼리 묶는 방법
  • StringBuilder 객체는 문자열을 구성하는데 사용되지만, 자체적으로 String 객체는 아님. toString() 을 통해 문자열로 변환할 수 있음.
profile
백엔드 개발자 김예인입니다.

0개의 댓글