ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [string] group anagrams
    Algorithm/LeetCode 2025. 1. 18. 14:36

    ✅ Problem

    https://leetcode.com/problems/group-anagrams/description/

     

    Approach & Solution

    방식1)

    더보기
    • 주어진 문자열 하나씩 비교한다.
      • 이중 for문 형태
      • 이미 그룹에 포함된 문자열은 이후 비교할 때 제외한다.
    • 두 문자열이 애너그램인지 어떻게 확인할까?
      • 문자열의 길이가 다른 경우 애너그램이 아니다.
      • 문자열의 길이가 같은 경우
        • 철자가 동일한지 확인한다.
          • 방안1) 알파벳 등장 횟수 비교 : Map 사용
          • 방안2) 문자열 사전식 정렬 후 두 문자열이 동일한지 확인
    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            List<List<String>> result = new ArrayList<>();
    
            int[] check = new int[strs.length]; // 이미 그룹에 포함되었는지 확인용 배열 : 1=true, 0=false
    
            for (int i = 0; i < strs.length; i++) {
                if (check[i] == 0) { // 그룹에 포함되지 않았을 때
                    String value = strs[i];
                    
                    List<String> group = new ArrayList<>();
                    group.add(value);
    
                    for (int j = i + 1; j < strs.length; j++) {
                        if (check[j] == 0) { // 그룹에 포함되지 않았을 때
                            String target = strs[j];
                            if (isAnagram(value, target)) {
                                group.add(target);
                                check[j] = 1;
                            }
                        }
                    }
    
                    result.add(group);
                    check[i] = 1;
                }
            }
            
            return result;
        }
    
        public boolean isAnagram(String a, String b) {
            boolean result = true;
    
            if (a.length() != b.length()) {
                result = false;
            } else {
                // a의 알파벳 등장 횟수 저장
                // b의 알파벳에 대해 a의 등장 횟수에서 차감
                Map<Character, Integer> spellingMap = new HashMap<>();
    
                for (int i = 0; i < a.length(); i++) {
                    int cnt = spellingMap.getOrDefault(a.charAt(i), 0);
                    spellingMap.put(a.charAt(i), cnt + 1);
                }
    
                for (int j = 0; j < b.length(); j++) {
                    int cnt = spellingMap.getOrDefault(b.charAt(j), 0);
                    if (cnt - 1 < 0) {
                        result = false;
                        break;
                    } else {
                        spellingMap.put(b.charAt(j), cnt - 1);
                    }
                }
    
            }
    
            return result;
        }
    
    }

     

    방식2)

    더보기
    • 문자열 사전식 정렬 후 그룹에 추가
    class Solution {
        public List<List<String>> groupAnagrams(String[] strs) {
            // 문자열 사전식 정렬 -> 동일한 문자열 일 때 그룹에 추가
            
            Map<String, List<String>> groupMap = new HashMap<>();
    
            for (String str : strs) {
                char[] chars = str.toCharArray();
                Arrays.sort(chars);
    
                String key = String.valueOf(chars); // 사전식 정렬된 배열을 문자열로 변환
                if (!groupMap.containsKey(key)) {
                    groupMap.put(key, new ArrayList<>());
                }
                groupMap.get(key).add(str);
            }
    
            return new ArrayList<>(groupMap.values());
        }
    }

    'Algorithm > LeetCode' 카테고리의 다른 글

    [array] product of array except self  (0) 2025.02.08
    [array] 3sum  (0) 2025.02.01
    [array] trapping rain water  (0) 2025.01.26
    [array] two sum  (1) 2025.01.25
    [string] longest palindromic substring  (0) 2025.01.19

    댓글

Designed by Tistory.