본문 바로가기
Programming/algorism

그룹 애너그램 (쓰면서 익히는 알고리즘 자료구조 p.143)

by sh.lee 2021. 11. 21.

2.4 배열의 회전

📌 Problem

    • 문자열 리스트가 주어지는데 리스트에 있는 문자열을 검사하여 서로 같은 애너그램을 가지는 문자열을 그룹으로 묶기
    • Example 1: Input: strs = ["a"] Output: [["a"]]
    • Example 2: Input: strs = [""] Output: [[""]]
    • Example 3: Input: strs = ["eat","tea","tan","ate","nat","bat"] Output: [["bat"],["nat","tan"],["ate","eat","tea"]] 

Constraints:

  • 리스트에 있는 모든 문자열은 소문자로 구성
  • 문자열 리스트

📝Solution

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
       List<List<String>> list = new ArrayList<List<String>>();
		Map<String, Integer> map = new HashMap();
		int q =0;
		for (int i =0; i<strs.length;i++) {
			char[] chrArray = strs[i].toCharArray();
			Arrays.sort(chrArray);
			 
			String key = new String(chrArray);
			if(map.get(key)==null) {
				// 키가 없을 때 리스트 추가
				map.put(key,q++);
				 ArrayList<String> l = new ArrayList<>();
	             l.add(strs[i]);
	             list.add(l);
			}else {
				// 키가 있을때 map의  value(인덱스) 가져와서 리스트 추가 
				int n = map.get(key);
				List<String> li = list.get(n);
                li.add(strs[i]);
                
			}
		}
		return list;
    }
}
  • 해시테이블 생성
  • key는 문자열 value 는 리스트의 index 
  • 입력 문자열 리스트를 순회
  • 문자열 정렬
  • 정렬된 문자열 검사하여 key가 있으면 리스트 인덱스 가져와서 리스트 추가
  • key가없으면 리스트 새로 추가