알고리즘/프로그래머스
베스트앨범 **
베리영young
2024. 4. 11. 08:33
사용 알고리즘 : 해시
사용 언어: java
다시 풀어보기~!
import java.util.*;
class Solution {
static class Music {
String genre; //노래의 장르
int play; //노래 재생 횟수
int idx; //노래 고유 번호
public Music(String genre, int play, int idx) {
this.genre = genre;
this.play = play;
this.idx = idx;
}
}
public int[] solution(String[] genres, int[] plays) {
// map: 먼저 나올 장르 순서 찾기 위한 밑작업
HashMap<String, Integer> map = new HashMap();
for(int i=0; i<genres.length; i++) {
// map에 이미 있는 장르라면, 기존 값에 + plays[i]
// map에 아직 없는 장르라면, 0 + plays[i]
map.put(genres[i],
map.getOrDefault(genres[i], 0)+plays[i]);
}
// 1. 장르 선정 (map을 plays합으로 정렬)
ArrayList<String> genres_ordered = new ArrayList<>();
while(map.size() != 0) {
int max = -1;
String max_key = "";
for(String key : map.keySet()) {
//맵의 key에 해당하는 총 음악 재생 횟수
//총 재생횟수 가장 많은 장르부터 꺼내기~~!
int tmp_cnt = map.get(key);
if(tmp_cnt > max) {
max = tmp_cnt;
max_key = key;
}
}
genres_ordered.add(max_key); //집어 넣고
map.remove(max_key); //꺼내기
}
//2. 장르 내 노래 선정 (탑2)
ArrayList<Music> result = new ArrayList<>();
//장르 돌면서~
for(String gern : genres_ordered) {
//장르에 해당하는 애들 중에 2개 뽑기 밑작업
ArrayList<Music> list = new ArrayList<>();
for(int i=0; i<genres.length; i++) {
if(genres[i].equals(gern)) {
//일단 넣기
list.add(new Music(gern, plays[i], i));
}
}
Collections.sort(list, (o1, o2) -> o2.play - o1.play); //장르별 내림차순 소팅, 람다식연습
result.add(list.get(0)); //1개는 무조건 수록됨
if(list.size() > 1) result.add(list.get(1));
}
//List에 저장한 답을 Array로 변환해서 반환
int[] answer = new int[result.size()];
for(int i=0; i<result.size(); i++) {
answer[i] = result.get(i).idx;
}
return answer;
}
}