Algorithm, programmers, 베스트 앨범(42579)
배운점
- 해시를 대충 알고있었는데 다시 공부해야겠다 공부의 연속…
- string은 == 으로 비교할수없고 equals로 구분해야한다. 실수금지
풀이
- 노래를 구분하기 위해 id값을 추가한 song 클래스를 만들어준다
class song {
int id;
String genre;
int plays;
song(int id, String genre, int plays){
this.id = id;
this.genre = genre;
this.plays = plays;
}
}
- 장르별로 총 재생수를 해시로 구현하고, song객체를 ArrayList에 넣는다
List<song> songList = new ArrayList<>();
Map<String, Integer> generPlay = new HashMap<>();
int play = 0;
for (int i=0; i<size; i++) {
songList.add( new song(i, genres[i], plays[i]));
if (generPlay.containsKey(genres[i]))
play = generPlay.get(genres[i]) + plays[i];
else
play = plays[i];
generPlay.put(genres[i], play);
}
- 노래 리스트를 정렬한다
- 장르가 같은것꺼리 묶고
- 장르가 같다면 재생수가 큰순으로 정렬
Comparator<song> Comp = new Comparator<song>() {
public int compare(song a, song b) {
// 장르가 같다면 재생수가 큰순으로 (int)
if(a.genre.equals(b.genre))
return b.plays - a.plays;
// 장르별로 정리 (string)
return a.genre.compareTo(b.genre);
}
};
songList.sort(Comp);
- 장르 - 총재생곡의 해시를 재생곡이 많은 순으로 정렬한다
Iterator it = sortByValue(generPlay).iterator(); // 총재생수가 큰 장르순으로 정렬
public static List sortByValue(final Map map) {
List<String> list = new ArrayList();
list.addAll(map.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v1).compareTo(v2);
}
});
Collections.reverse(list); // 주석시 오름차순
return list;
}
- 장르 - 총재생곡의 해시를 돌며 각 장르당 2곡씩 정답 ArrayList에 담는다.
Iterator it = sortByValue(generPlay).iterator(); // 총재생수가 큰 장르순으로 정렬
List<Integer> answer2 = new ArrayList<>();
while(it.hasNext()) {
String key = (String) it.next();
int num = 0;
for (int i=0; i<size; i++) {
// 장르별로 2곡까지만 뽑는다
if (songList.get(i).genre.equals(key) && num < 2) {
answer2.add(songList.get(i).id);
++num;
}
}
}
전체코드
package org.programmers;
import java.util.*;
import org.programmers.kakao_2019_Tree_findWay.Node;
public class test42579_bestAlbum {
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] genres = {"classic", "pop", "classic", "classic", "pop"};
int[] plays = {500, 600, 150, 800, 2500};
test42579_bestAlbum t = new test42579_bestAlbum();
t.solution(genres, plays);
}
class song {
int id;
String genre;
int plays;
song(int id, String genre, int plays){
this.id = id;
this.genre = genre;
this.plays = plays;
}
}
Comparator<song> Comp = new Comparator<song>() {
public int compare(song a, song b) {
// 장르가 같다면 재생수가 큰순으로 (int)
if(a.genre.equals(b.genre))
return b.plays - a.plays;
// 장르별로 정리 (string)
return a.genre.compareTo(b.genre);
}
};
public int[] solution(String[] genres, int[] plays) {
int size = genres.length;
List<song> songList = new ArrayList<>();
Map<String, Integer> generPlay = new HashMap<>();
int play = 0;
for (int i=0; i<size; i++) {
songList.add( new song(i, genres[i], plays[i]));
if (generPlay.containsKey(genres[i]))
play = generPlay.get(genres[i]) + plays[i];
else
play = plays[i];
generPlay.put(genres[i], play);
}
songList.sort(Comp);
Iterator it = sortByValue(generPlay).iterator(); // 총재생수가 큰 장르순으로 정렬
List<Integer> answer2 = new ArrayList<>();
while(it.hasNext()) {
String key = (String) it.next();
int num = 0;
for (int i=0; i<size; i++) {
// 장르별로 2곡까지만 뽑는다
if (songList.get(i).genre.equals(key) && num < 2) {
answer2.add(songList.get(i).id);
++num;
}
}
}
int[] answer = new int[answer2.size()];
for (int i=0; i<answer2.size(); i++) {
answer[i] = answer2.get(i);
System.out.print(answer[i]+" ");
}
return answer;
}
public static List sortByValue(final Map map) {
List<String> list = new ArrayList();
list.addAll(map.keySet());
Collections.sort(list,new Comparator() {
public int compare(Object o1,Object o2) {
Object v1 = map.get(o1);
Object v2 = map.get(o2);
return ((Comparable) v1).compareTo(v2);
}
});
Collections.reverse(list); // 주석시 오름차순
return list;
}
}
Reference