in.add()

[42579] 베스트 앨범 본문

Algorithm/Programmers

[42579] 베스트 앨범

idan 2021. 11. 8. 20:55

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42579

 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

 

문제 해결 방법

해시 맵과 정렬을 사용했다.

 

 

import java.util.*;

class Solution {
    ArrayList<Song> playlist;
    ArrayList<Song> bestalbum;
    HashMap<String, Integer> genremap;
    HashMap<String, Integer> albummap;
    
    class Song implements Comparable<Song>{
        int id;
        String genre;
        int play;
        
        public Song(int id, String genre, int play) {
            this.id = id;
            this.genre = genre;
            this.play = play;
        }
        
        @Override
        public int compareTo(Song s) {
            if(this.play == s.play) {
                return this.id - s.id;
            } else if(this.play > s.play) {
                return -1;
            } else {
                return 1;
            }
        }
        
    }
    public int[] solution(String[] genres, int[] plays) {

        playlist = new ArrayList<>();
        bestalbum = new ArrayList<>();
        genremap = new HashMap<>();
        albummap = new HashMap<>();
        
        for(int i = 0; i < genres.length; i++) {
            int id = i;
            String genre = genres[i];
            int play = plays[i];
            
            playlist.add(new Song(id, genre, play));
            
            if(!genremap.containsKey(genre)) {
                genremap.put(genre, play);
            } else {
                genremap.put(genre, genremap.get(genre) + play);
            }
        }
        
        Collections.sort(playlist, new Comparator<Song>(){
            @Override
            public int compare(Song s1, Song s2) {
                if(s1.genre.equals(s2.genre)) {
                    return s1.compareTo(s2);
                } else {
                    return genremap.get(s2.genre) - genremap.get(s1.genre);
                }
            }
        });
        
        for(Song s : playlist) {
            if(!albummap.containsKey(s.genre)) {
                albummap.put(s.genre, 1);
                bestalbum.add(s);
            } else {
                if(albummap.get(s.genre) > 1) {
                    continue;
                } else {
                    albummap.put(s.genre, 2);
                    bestalbum.add(s);
                }
            }
        }
        
        int[] answer = new int[bestalbum.size()];
        for(int i = 0; i < answer.length; i++) {
            answer[i] = bestalbum.get(i).id;
        }
        
        return answer;
    }
}

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

[84021] 3주차_퍼즐 조각 채우기  (0) 2021.10.29
[42628] 이중우선순위큐  (0) 2021.10.28
[43162] 네트워크  (0) 2021.10.26
[62048] 멀쩡한 사각형  (0) 2021.10.25
[1844] 게임 맵 최단거리  (0) 2021.10.16
Comments