- hashMap -> getOrDefault() : 찾는 키가 존재하면 해당 키의 값을 반환하고, 없으면 기본값을 반환함
ex) hashMap.put(key,hashMap.getOrDefault(key,0)+1);- String -> String[] 배열로 변환
ex) String[]strArr=str.split("");- HashMap에 Value를 기준으로 내림차순
- List안에 Map을 넣는다.
- Map.Entry는 -> 본래 맵에 key, value값 전체를 가진다. 이 부분을 hashMap.entrySet()을 이용해서 전체를 넣는다.
Map.Entry를 이용하는 이유는 entrySet()을 받기 위해서 사용
(hashMap.entrySet()에는 key, value들이 들어가 있다.)- Collections sort를 이용해서 정렬한다.
List<Map.Entry<String,Integer>> entryList=new ArrayList<Map.Entry<String,Integer>>(hashMap.entrySet()); Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); // 내림차순 return o1.getValue().compareTo(o2.getValue()); //오름차순 } }); // lambda를 이용한 정렬 (람다를 이용한것이 훨씬 편리) Collections.sort(entryList,(o1,o2)->(o2.getValue().compareTo(o1.getValue())));
- 람다를 이용한 정렬 표현법을 꼭 익히자
Collections.sort(entryList,(o1,o2)->(o2.getValue().compareTo(o1.getValue())));
- 정렬된 arraylist에 첫번째 인자인 key를 뽑는 방법
Map.Entry<String, Integer> stringIntegerEntry = entryList.get(0);

방법 1. Collection.sort를 이용한 정렬
방법 2. 가장 작은 값을 설정해주고 비교 하는 방법
    public String solution(int n,String str) {
        String answer="";
        // HashMap 이용
        HashMap<String,Integer> hashMap=new HashMap<>();
        // str -> string 배열로
        String[]strArr=str.split("");
        for (String key:strArr) {
            hashMap.put(key,hashMap.getOrDefault(key,0)+1);
        }
        // 가장 큰것 찾음
        // hashMap에 value를 기준으로 내림차순
        // List안에 Map을 넣는다.
        // Map.Entry는 -> 본래 맵에 key, value값  전체를 가진다. 이 부분을 hashMap.entrySet()을 이용해서 전체를 넣는다.
        List<Map.Entry<String,Integer>> entryList=new ArrayList<Map.Entry<String,Integer>>(hashMap.entrySet());
        Collections.sort(entryList, new Comparator<Map.Entry<String, Integer>>() {
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                return o2.getValue().compareTo(o1.getValue());
            }
        });
        // 첫번째 인덱스를 꺼낸다?
        Map.Entry<String, Integer> stringIntegerEntry = entryList.get(0);
        answer=stringIntegerEntry.getKey();
        return answer;
    }    public String solution2(int n,String str) {
        String answer="";
        // HashMap 이용
        HashMap<String,Integer> hashMap=new HashMap<>();
        // str -> string 배열로
        String[]strArr=str.split("");
        for (String key:strArr) {
            hashMap.put(key,hashMap.getOrDefault(key,0)+1);
        }
        int maxValue=Integer.MIN_VALUE;
        for (String s:strArr) {
            if (hashMap.get(s)>maxValue) {
                maxValue=hashMap.get(s);
                answer=s;
            }
        }
      
        return answer;
    }

슬라이싱 윈도우 + Hash 사용
- 인덱스 접근을 위해 arrayList 사용
- 슬라이싱 윈도우 안에 for문으로 size 검사시 시간초과 발생했었음
- 해결방법으로는 arrayList사용 및 hashMap에 value 크기를 확인하여 제거
public void solution(int n,int m,int []arr) {
        ArrayList<Integer>arrayList=new ArrayList<>();
        // 초기값
        for (int i=0;i<m;i++) {
            arrayList.add(arr[i]);
        }
        // 첫번째 값 확인
        HashMap<Integer,Integer> hashMap=new HashMap<>();
        for (int i=0;i< arrayList.size();i++) {
            hashMap.put(arrayList.get(i),hashMap.getOrDefault(arrayList.get(i),0)+1);
        }
        System.out.print(hashMap.keySet().size()+" ");
        // 슬라이싱 윈도우 for문
        // arraylist를 사용하는 이유는 인덱스 접근이 자유롭기 때문에
        for (int i=m;i<n;i++) {
            // 처음 값 빼주기
            int temp=arrayList.remove(0);
            int value=hashMap.get(temp)-1;
            hashMap.put(temp,value);
            if (value==0) {
                hashMap.remove(temp);
            }
            // 이 부분으로 인해 시간초과 발생 -> 이슈
//            hashMap=new HashMap<>();
//            for (int j=0;j< arrayList.size();j++) {
//                hashMap.put(arrayList.get(j),hashMap.getOrDefault(arrayList.get(j),0)+1);
//            }
            // 다음 값 더해주기
            int key=arr[i];
            hashMap.put(key,hashMap.getOrDefault(key,0)+1);
            arrayList.add(key);
            System.out.print(hashMap.keySet().size()+" ");
        }
    }