프로그래머스 해시-베스트앨범

박병주·2024년 10월 16일
0

알고리즘

목록 보기
14/14

프로그래머스 고득점 kit 풀이 중
Map에 대한 foreach문 사용 사용 및 Comparable 구현 메모

Comparable Interface > compareTo

return 에 따른 값 비교 기준

  • 음수 : 현재 객체(this)가 비교 대상 객체보다 작을 때.
  • 0 : 현재 객체와 비교 대상 객체가 같을 때.
  • 양수 : 현재 객체가 비교 대상 객체보다 클 때.
@Override
public int compareTo(Music m){
    if(this.plays == m.plays){
         return this.idx - m.idx;
    }
    return m.plays - this.plays;
}

Map foreach 사용

map.forEach((key, value) -> {
    pq.offer(value);
});

map add 개선

if(map.get(g) != null){
    map.get(g).addMusic(m);
} else {
    map.put(g, new Genres());
    map.get(g).addMusic(m);
}
  • computeIfAbsent 활용
map.computeIfAbsent(g, k -> new Genres()).addMusic(m);

전체 코드

import java.util.*;

class Solution {
    class Music implements Comparable<Music>{
        int plays, idx;
        Music(int plays, int idx){
            this.plays = plays;
            this.idx = idx;
        }
        
        @Override
        public int compareTo(Music m){
            if(this.plays == m.plays){
                return this.idx - m.idx;
            }
            return m.plays - this.plays;
        }
        
    }
    class Genres implements Comparable<Genres>{
        PriorityQueue<Music> music;
        int total = 0;
        Genres(){
            music = new PriorityQueue<>();
        }
        public void addMusic(Music m){
            music.offer(m);
            total += m.plays;
        }
        
        @Override
        public int compareTo(Genres g){
            return g.total - this.total;
        }
    }
    
    
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Genres> map = new HashMap<>();
        for(int i = 0; i < genres.length; i++){
            String g = genres[i];
            int p = plays[i];
            Music m = new Music(p, i);
            if(map.get(g) != null){
                map.get(g).addMusic(m);
            } else {
                map.put(g, new Genres());
                map.get(g).addMusic(m);
            }
        }
        PriorityQueue<Genres> pq = new PriorityQueue<>();
        
        map.forEach((key, value) -> {
            pq.offer(value);
        });
        ArrayList<Integer> list = new ArrayList<>();
        while(!pq.isEmpty()){
            Genres cur = pq.poll();
            
            if(cur.music.size() == 1){
                list.add(cur.music.poll().idx);
            } else {
                list.add(cur.music.poll().idx);
                list.add(cur.music.poll().idx);
            }

        }
        int[] answer = new int[list.size()];
        for(int i = 0; i < answer.length; i++){
            answer[i] = list.get(i);
        }
        return answer;
    }
}
profile
응애

0개의 댓글

Powered by GraphCDN, the GraphQL CDN