[lv.3] 베스트앨범

RTUnu12·2024년 2월 15일
0

Programmers

목록 보기
5/41

https://school.programmers.co.kr/learn/courses/30/lessons/42579

  • 문제
    각 장르와 재생 수가 담긴 배열 두 개를 이용하여
    베스트 앨범을 만들 때 각 장르당 2개씩 가장 많은 재생 수의 음악의 번호를 배열 형태로 출력해라.
    이때, 장르 별로도 총 재생수가 많은 장르부터 먼저 수록한다.

  • 풀이
    Music 객체를 만든 다음, 이 객체로 이루어진 List를 생성하여 재생 수를 기준으로 정렬한다.
    이후, 장르와 그 장르의 총 재생수를 저장하는 HashMap을 만들고, 이 역시도 List 형태로 만들어 정렬.
    이후 장르의 총 재생수에 따라 각 음악의 List에서 이를 상위 2개씩만 뽑아와 고유 번호를 배열에 저장한 후 리턴.

  • 소감
    30분 컷.
    어우씨...로직 자체는 이게 왜 lv3인가 의아할 정도로 쉽지만...
    문제는 구현. 만약 이게 pccp였으면 로직은 바로 떠올려도 각 객체의 메소드 등등의 명칭으로 인해 골머리를 쌓았을 것이다.
    여기서 기억해야할 건
    1) 객체의 정렬방법

    ...implements Comparable<Music>
    
    @Override
      public int compareTo(Music o){
          return o.play - play;
      }

    2) List를 비롯한 Collection의 정렬

    Collections.sort(list);

    3) 전체 Entry 뽑아오기

    for(Entry<String, Integer> e : map.entrySet())

    4) List를 Array로

    arr = list.toArray(Integer[]::new);
    //반대는 Arrays.toList(arr);
  • 코드

import java.util.*;
import java.util.Map.*;

class Music implements Comparable<Music>{
    int num;
    String genre;
    int play;
    public Music(int num, String genre, int play){
        this.num = num;
        this.genre = genre;
        this.play = play;
    }
    @Override
    public int compareTo(Music o){
        return o.play - play;
    }
    @Override
    public String toString(){
        return genre+" "+play;
    }
}

class Solution {
    public Integer[] solution(String[] genres, int[] plays) {
        Integer[] answer = {};
        ArrayList<Integer> score = new ArrayList<>();
        LinkedList<Music> list = new LinkedList<>();
        HashMap<String, Integer> map = new HashMap<>();
        for(int i=0; i<genres.length; i++){
            list.add(new Music(i, genres[i], plays[i]));
            if(map.containsKey(genres[i])){
                int play = map.get(genres[i]);
                map.put(genres[i], play+plays[i]);
            }
            else map.put(genres[i], plays[i]);
        }
        Collections.sort(list);
        LinkedList<Music> genreList = new LinkedList<>();
        for(Entry<String, Integer> e : map.entrySet()){
            genreList.add(new Music(0, e.getKey(), e.getValue()));
        }
        Collections.sort(genreList);
        //System.out.println(list);
        //System.out.println(genreList);
        for(Music g : genreList){
            String nowG = g.genre;
            int cnt = 0;
            for(Music m : list){
                if(nowG.equals(m.genre) && cnt!=2){
                    cnt++;
                    score.add(m.num);
                }
            }
        }
        answer = score.toArray(Integer[]::new);
        return answer;
    }
}
profile
이제 나도 현실에 부딪힐 것이다.

0개의 댓글