안녕하세요. 오늘은 프로그래머스의 베스트앨범 문제를 풀어보겠습니다.
https://programmers.co.kr/learn/courses/30/lessons/42579
key가 String(장르), value가 Integer(총 횟수)인 hashMap에 저장하면서 각 장르별로 재생된 총 횟수를 셉니다.
위에서 count한 map의 key값을 따로 keySet에 저장합니다. 그 후 저장된 key를 value값을 기준으로 내림차순 sort해줍니다.
예를 들어, 아래와 같은 map에 해당 로직을 수행하면
장르 | 횟수 |
---|---|
classic | 1450 |
pop | 3100 |
다음과 같은 결과가 도출됩니다.
결과 |
---|
pop |
classic |
2의 수행 결과값을 토대로 key가 genre index이고 value가 각 재생횟수인 map 생성합니다. 그 후 해당 map의 key를 2번과 같은 방식으로 sort합니다.(keySet을 map의 value로 내림차순 정렬)
한 장르에서 재생된 노래가 여러 개라면, 그 노래들 중 가장 많이 재생된 2개의 노래만 answer배열에 저장합니다.
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer;
int arrLen = genres.length;
List<Integer> arrAnswer = new ArrayList<>();
Map<String, Integer> totalAmount = new HashMap<>();
for (int i = 0; i < arrLen; i++) {
totalAmount.put(genres[i], totalAmount.getOrDefault(genres[i], 0) + plays[i]);
}
List<String> keySet = new ArrayList<>(totalAmount.keySet());
keySet.sort((s1, s2) -> totalAmount.get(s2).compareTo(totalAmount.get(s1)));
for (String key : keySet) {
Map<Integer, Integer> hMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
if (key.equals(genres[i])) {
hMap.put(i, plays[i]);
}
}
List<Integer> hMapKeySet = new ArrayList<>(hMap.keySet());
hMapKeySet.sort((s1, s2) -> hMap.get(s2).compareTo(hMap.get(s1)));
int j = 0;
for (int c : hMapKeySet) {
if (j > 1) break;
arrAnswer.add(c);
j++;
}
}
answer = new int[arrAnswer.size()];
for (int i = 0; i < arrAnswer.size(); i++) {
answer[i] = arrAnswer.get(i);
}
return answer;
}
}
최근 책을 읽으면서 람다식에 익숙해지는 연습중이어서 compareTo를 람다식으로 써보려고 노력했다.
Collections.sort(keySet, (s1, s2) -> map.get(s2).compareTo(map.get(s1)));
keySet.sort((s1, s2) -> map.get(s2).compareTo(map.get(s1)));