ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Programmers] 베스트앨범
    Algorithm/Programmers 2020. 4. 24. 01:54

    [Level 3] 베스트앨범

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

    • 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려한다.
    • 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같다.
    • 1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
    • 2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
    • 3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.
    • 노래의 장르를 나타내는 genres[]와 노래별 재생 횟수를 나타내는 plays[]가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하시오. 

     

     

    Solution

    • HashMap의 key는 장르이름, value로는 genreList의 index를 가짐
    • Genre 마다 내부적으로 리스트를 만들어 같은 Genre의 노래를 저장하고, 우선순위를 위한 totalPc 변수도 생성
    • GenreList를 totalPc를 기준으로 내림차순으로 정렬하고, list에서 두 개씩 뽑아 playList에 추가

     

     

    소스코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    import java.io.IOException;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
     
    public class Solution {
        static Map<String, Integer> map;
        static List<Genre> genreList;
        static List<Integer> playList;
        static int[] answers;
     
        static class Song implements Comparable<Song> {
            private int id;
            private int pc;
     
            public Song(int id, int pc) {
                this.id = id;
                this.pc = pc;
            }
     
            @Override
            public int compareTo(Song o) {
                return (o.pc > this.pc) ? 1 : (o.pc == this.pc) ? (this.id - o.id) : -1;
            }
        }
     
        static class Genre implements Comparable<Genre> {
            private String name;
            private int count = 0;
            private int totalPc = 0;
            private List<Song> list;
     
            public Genre(String name, int count, int id) {
                list = new LinkedList<>();
                this.name = name;
                addSong(id, count);
            }
     
            public void addSong(int id, int pc) {
                list.add(new Song(id, pc));
                this.totalPc += pc;
                this.count++;
            }
     
            @Override
            public int compareTo(Genre o) {
                return o.totalPc - this.totalPc;
            }
        }
     
        static int[] solution(String[] genres, int[] plays) {
            init();
            int index = 0;
            for (int i = 0; i < genres.length; i++) {
                if (map.containsKey(genres[i])) {
                    genreList.get(map.get(genres[i])).addSong(i, plays[i]);
                } else {
                    map.put(genres[i], index);
                    genreList.add(new Genre(genres[i], plays[i], i));
                    index++;
                }
            }
            Collections.sort(genreList);
            addPlayList();
            return answers;
        }
     
        static void addPlayList() {
            for (Genre g : genreList) {
                Collections.sort(g.list);
                int count = 0;
                while (count < 2) {
                    playList.add(g.list.get(count).id);
                    count++;
                    if (g.count < 2) {
                        break;
                    }
                }
            }
            answers = new int[playList.size()];
            for (int i = 0; i < playList.size(); i++) {
                answers[i] = playList.get(i);
            }
        }
     
        static void init() {
            map = new HashMap<>();
            genreList = new LinkedList<>();
            playList = new LinkedList<>();
        }
    }
    cs

    'Algorithm > Programmers' 카테고리의 다른 글

    [Programmers] 다리를 건너는 트럭  (0) 2020.05.30
    [Programmers] 스킬트리  (0) 2020.05.30
    [Programmers] 프린터  (0) 2020.05.29
    [Programmers] 주식가격  (0) 2020.05.29
    [Programmers] 종이접기  (0) 2020.04.23

    댓글

Designed by Tistory.