[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 반환.
- 해시맵은 중복이 안된다.
- 람다 많이 알고싶다.
- 깃 오류 빡친다.