[Programmers]-베스트앨범(해시)

문제

“코딩테스트 고득점 Kit - 해시” 문제이다.

코드

import java.util.HashMap;
import java.util.Collections;
import java.util.ArrayList;
import java.util.Comparator;

class Solution {
    class Music{
        String genre;
        int play;
        int index;
        public Music(String genre, int play, int index){
            this.genre = genre;
            this.play = play;
            this.index = index;
        }
    }
    public int[] solution(String[] genres, int[] plays) {
        int len = genres.length;
        HashMap<String, Integer> totalStream = new HashMap<>();
        //장르별 스트림 수Map
        ArrayList<Music> list = new ArrayList<>();//객체 리스트
        for(int i = 0;i<len;i++){
            list.add(new Music(genres[i],plays[i],i));
            totalStream.put(genres[i], totalStream.getOrDefault(genres[i],0)+plays[i]);
        }

        ArrayList<String> totalList = new ArrayList<>(totalStream.keySet());//장르 리스트
        //정렬
        Collections.sort(totalList,(o1,o2)-> totalStream.get(o2).compareTo(totalStream.get(o1)));

        ArrayList<Music> result = new ArrayList<>();//최종리스트
        ArrayList<Music> mList = new ArrayList<>();//임시리스트

        for(String totalKey : totalList){//장르리스트 
            for(Music muse : list){//전체 리스트
                if(totalKey.equals(muse.genre)){//장르별로 담는다
                    mList.add(new Music(muse.genre, muse.play, muse.index));
                }
            }

            Collections.sort(mList, (o1, o2) -> o2.play - o1.play);//내림차순

            result.add(mList.get(0));//처음은 그냥추가
            if(mList.size() > 1) result.add(mList.get(1));

            mList.clear();
        }

        int[] answer = new int[result.size()];
        for(int i=0;i<result.size();i++){//반환결과에 담기
            answer[i] = result.get(i).index;
        }
        return answer;
    }
}

코드 설명

너무 해시맵에만 몰두하려했다. 그냥 List도 쓰면 쉬운걸. 최대한 주석달았다 다음에봐도 알아보게.

요약

  • getOrDefault(key, defaultValue) : 해시맵에 key가 있으면 key의 value반환, key가 없으면 defaultValue 반환.
  • 해시맵은 중복이 안된다.
  • 람다 많이 알고싶다.
  • 깃 오류 빡친다.