스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다.
제한사항
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
//정답을 담는 리스트
ArrayList<Integer> result = new ArrayList<>();
//장르, 재생수
Map<String, Integer> count = new HashMap<>();
//징르마다 재생횟수 계산
for(int i = 0; i < genres.length; i++){
if(count.containsKey(genres[i])) {
int playCount = count.get(genres[i]);
count.put(genres[i], playCount+plays[i]);
}
else
count.put(genres[i],plays[i]);
}
//장르값을 key list로 가져옴
List<String> keySetList = new ArrayList<>(count.keySet());
//장르별 재생횟수(value)만큼 내림차순 정렬
Collections.sort(keySetList, (o1, o2) -> (count.get(o2).compareTo(count.get(o1))));
for(String key : keySetList){
//곡번호, 재생수
Map<Integer, Integer> temp = new HashMap<>();
for(int i = 0; i < plays.length; i++){
if(key.equals(genres[i])){
temp.put(i, plays[i]);
}
}
List<Integer> genrekeys = new ArrayList<>(temp.keySet());
Collections.sort(genrekeys, (o1, o2) -> (temp.get(o2).compareTo(temp.get(o1))));
if(genrekeys.size() >= 2){
if(temp.get(genrekeys.get(0)) == temp.get(genrekeys.get(1))){
if(genrekeys.get(0) > genrekeys.get(1)){
result.add(genrekeys.get(1));
result.add(genrekeys.get(0));
}
}
else{
result.add(genrekeys.get(0));
result.add(genrekeys.get(1));
}
}
else{
//장르 곡이 하나인 경우
result.add(genrekeys.get(0));
}
}
answer = new int[result.size()];
for(int i = 0; i < result.size(); i++){
answer[i] = result.get(i);
}
return answer;
}
}
문제는 크게 복잡하지 않고, 특정 알고리즘을 사용해야하는 것도 아니다. 다만 collection 객체를 사용해서 원하는 값을 찾는 과정이 조금 까다로웠다. 내 코드도 효율성을 따지지 않고 문제 풀이에만 집중하여 풀었기 때문에 잘 짜여진 코드라고는 볼 수 없다.