티스토리 뷰
해시문제 베스트 앨범
코드
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String,PlayData> map = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
PlayData playData;
playData = new PlayData(i);
playData.put(i, plays[i]);
map.merge(genres[i], playData, PlayData::merge);
}
Iterator iterator = PlayData.sortByTotalValue(map).iterator();
ArrayList<Integer> list = new ArrayList<>();
while(iterator.hasNext()) {
String temp = (String) iterator.next();
HashMap<Integer, Integer> result = map.get(temp).getPlayList();
Iterator playIterator = sortByValue(result).iterator();
int i = 0;
while(playIterator.hasNext() && i < 2) {
i++;
list.add((int)playIterator.next());
}
}
answer = list.stream().mapToInt(i->i).toArray();
return answer;
}
public static List sortByValue(HashMap allList) {
List<Integer> list = new ArrayList();
list.addAll(allList.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = allList.get(o1);
Object v2 = allList.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return list;
}
}
class PlayData {
private HashMap<Integer, Integer> allList = new HashMap<>();
private int total = 0;
int index;
int plays;
public PlayData(int index) {
this.index = index;
}
public HashMap<Integer, Integer> getPlayList() {
return allList;
}
public int getTotal() {
return total;
}
public int[] getPlayInfo() {
return new int[]{index, plays};
}
public void put(int index, int plays) {
this.plays = plays;
this.total += plays;
allList.put(index, plays);
}
public static PlayData merge(PlayData playData, PlayData playData1) {
int[] value = playData1.getPlayInfo();
playData.put(value[0], value[1]);
return playData;
}
public static List sortByTotalValue(HashMap allList) {
List<Integer> list = new ArrayList();
list.addAll(allList.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = ((PlayData)allList.get(o1)).getTotal();
Object v2 = ((PlayData)allList.get(o2)).getTotal();
return ((Comparable) v2).compareTo(v1);
}
});
return list;
}
}
코드 내용 요약
for (int i = 0; i < genres.length; i++) {
PlayData playData;
playData = new PlayData(i);
playData.put(i, plays[i]);
map.merge(genres[i], playData, PlayData::merge);
}
한 장르의 데이터를 맵에 넣기위해 PlayData 클래스를 만들어서 같은 장르를 인덱스별로 보관하기 위해 PlayData 클래스 내부에 allList라는 맵을 만들어주고 인덱스와 플레이 횟수를 저장해줌
public static PlayData merge(PlayData playData, PlayData playData1) {
int[] value = playData1.getPlayInfo();
playData.put(value[0], value[1]);
return playData;
}
map.merge를 사용해서 같은 장르의 앨범을 PlayData 안의 allList에 넣도록 해줌
public static List sortByTotalValue(HashMap allList) {
List<Integer> list = new ArrayList();
list.addAll(allList.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = ((PlayData)allList.get(o1)).getTotal();
Object v2 = ((PlayData)allList.get(o2)).getTotal();
return ((Comparable) v2).compareTo(v1);
}
});
return list;
}
총 플레이 횟수를 기준으로 정렬시키기 위한 코드
list.addAll(allList.keySet()); 로 키값의 list를 리턴할 수 있도록 처리
public static List sortByValue(HashMap allList) {
List<Integer> list = new ArrayList();
list.addAll(allList.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = allList.get(o1);
Object v2 = allList.get(o2);
return ((Comparable) v2).compareTo(v1);
}
});
return list;
}
같은 장르의 노래들을 플레이 수 순으로 정렬 후
while(playIterator.hasNext() && i < 2) {
i++;
list.add((int)playIterator.next());
}
최상위 곡 2개를 뽑아서 저장
answer = list.stream().mapToInt(i->i).toArray();
문제의 리턴형은 int형 배열이기 때문에 list를 int형 array로 바꾸는 mapToInt를 사용하여 변환
'개발 > Algorithm' 카테고리의 다른 글
프로그래머스 DP - 등굣길 (0) | 2020.12.08 |
---|---|
프로그래머스 DP - 도둑질 (0) | 2020.12.05 |