public int[] solution(String[] genres, int[] plays) {
Map<String, Integer> genrePlayCntMap = new HashMap<>();
Map<String, Map<Integer, Integer>> songPlayMap = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
// 장르별 재생수 카운트
int oldScore = genrePlayCntMap.getOrDefault(genres[i], 0);
genrePlayCntMap.put(genres[i], oldScore + plays[i]);
// 해당 장르의 첫 번째 곡이라면 빈 HashMap 데이터 새로 할당
// key: 인덱스, value: 해당 곡의 재생수를 가지는 Map 데이터 추가
songPlayMap.computeIfAbsent(genres[i], k -> new HashMap<>()).put(i, plays[i]);
}
// 노래들의 재생수가 가장 많은 장르부터 내림차순 정렬
ArrayList<String> keySet = new ArrayList<>(genrePlayCntMap.keySet());
keySet.sort(((o1, o2) -> genrePlayCntMap.get(o2).compareTo(genrePlayCntMap.get(o1))));
List<Integer> answerList = new ArrayList<>();
int answerIndex = 0;
for (String s : keySet) {
// 인기 장르 순으로 추출
Map<Integer, Integer> map = songPlayMap.get(s);
ArrayList<Integer> integers = new ArrayList<>(map.keySet());
integers.sort(((o1, o2) -> map.get(o2).compareTo(map.get(o1))));
for (int playCnt : integers) {
answerList.add(playCnt);
if (answerIndex++ == 1) break; // 장르별 두 곡까지만 수록
}
answerIndex = 0;
}
return answerList.stream().mapToInt(Integer::intValue).toArray();
}
처음으로 프로그래머스 문제를 풀어보았다. 확실히 입출력 면에서는 백준보다 편한 것 같다. 프로그래머스 사이트에서 다른 사람들의 풀이를 봤는데 굉장히 화려하고 복잡해보였다. 백준처럼 실행시간 기준으로 볼 수 있으면 좋겠다는 생각이 들었다.
어쨌든 로직 자체를 생각하는 것은 별로 걸리지 않았는데 내가 해시에 익숙하지 않아 시간이 좀 걸렸다. (1시간 정도) 내 개발 실력이 한참 부족하다는 것을 체감했다. 좀 더 열심히 하자.