코딩 테스트/자료구조

[프로그래머스] 베스트앨범 - HashMap, Collections

토자맨 2024. 6. 24. 23:07

문제

  • 입력값
    • 특정 노래 장르인 genres[]와 특정 노래 재생 횟수인 plays[]가 주어진다.
  1. 전체 노래 재생 횟수가 많은 장르부터 수록한다.
  2. 특정 장르 내에서 재생 횟수가 많은 순으로 정렬한다.
  3. 만약 특정 장르 내에서 재생 횟수가 같다면 고유 번호가 낮은 노래부터 수록한다.
    위 방식대로 수록했을 때 노래의 고유 번호를 반환하라일단 반쯤 풀었는데 코드랑 설명 다 날아갔고 오늘 컨디션이 너무 안좋아서 못풀고 코드 분석만 진행했다.
    내일 다시 풀어보겠다.코드

    풀이

  4. 실패 - 다른 사람 코드 참조
  5. 카테고리별 총 재생 횟수를 num에 저장하고 특정 카테고리 노래 인덱스 및 재생 횟수를 music에 저장한다.
  6. num을 내림차순 정렬한다.
  7. music에서 재생 횟수를 기준으로 내림차순 정렬한다.
  8. num에 정렬된 카테고리 순서대로 music의 노래 인덱스를 앞에서부터 2개 가져와 ArrayList인 answer에 저장한다.
  9. answer를 int[] 형태로 변환 후 반환한다.
import java.util.*;
class Solution {  
public int\[\] solution(String\[\] genres, int\[\] plays) {  
ArrayList answer = new ArrayList<>();
    HashMap<String, Integer> num = new HashMap<>(); // 카테고리별 총 재생횟수
    HashMap<String, HashMap<Integer, Integer>> music = new HashMap<>(); // 특정 카테고리 노래 인덱스 및 재생횟수

    // 카테고리별 총 재생횟수 저장(num)
    // 특정 카테고리 노래 인덱스, 재생 횟수 저장(music)
    for(int i = 0; i < plays.length; i++) {
        if(!num.containsKey(genres[i])) {
            HashMap<Integer, Integer> map = new HashMap<>();
            map.put(i, plays[i]);
            music.put(genres[i], map);
            num.put(genres[i], plays[i]);
        } else {
            music.get(genres[i]).put(i, plays[i]);
            num.put(genres[i], num.get(genres[i]) + plays[i]);
        }
    }

    // 카테고리별 총 재생횟수 내림차순 정렬
    List<String> keySet = new ArrayList(num.keySet());
    Collections.sort(keySet, (s1, s2) -> num.get(s2) - (num.get(s1)));

    // 특정 카테고리의 노래들 재생 횟수 기준 내림차순 정렬
    for(String key : keySet) {
        HashMap<Integer, Integer> map = music.get(key);
        List<Integer> genre_key = new ArrayList(map.keySet());

        Collections.sort(genre_key, (s1, s2) -> map.get(s2) - (map.get(s1)));

        // 특정 카테고리의 노래 앞에서부터 2개 answer 배열에 저장
        answer.add(genre_key.get(0));
        if(genre_key.size() > 1)
            answer.add(genre_key.get(1));
    }

    return answer.stream().mapToInt(i -> i).toArray();
}

추가로 학습해야할 것

Collections

https://jisunshine.tistory.com/169