Notice
Recent Posts
Recent Comments
Link
«   2026/01   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Mini

[틀림] 프로그래머스 베스트 앨범 // 해시맵, 구현, 스트림, 리스트 정렬 본문

Algorithm/해시

[틀림] 프로그래머스 베스트 앨범 // 해시맵, 구현, 스트림, 리스트 정렬

Mini_96 2025. 7. 30. 02:20

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

* 풀이

m1 <장르, List<재생횟수, index>>

m2 <장르, 총 재생횟수>

맵 2개를 만든다.

m2를 정렬하고 그 키값에 대해 정렬된순서로 순회하면서

m1을 꺼낸다.

m1을 정렬한다. (재생횟수기준 내림차순)

2개를 뽑고 정답에 추가한다.

 

* 전체코드

import java.util.*;

class pair{
    int idx, cnt;
    pair(int idx, int cnt){
        this.idx=idx;
        this.cnt=cnt;
    }
    
    public String toString(){
        return this.idx+" "+this.cnt;
    }
}

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        ArrayList<Integer> ret = new ArrayList<>();
        
        HashMap<String,ArrayList<pair>> m1 = new HashMap<>(); //<장르, 곡정보들(cnt,index>)
        HashMap<String,Integer> m2 = new HashMap<>(); // <장르, 재생횟수>
        
        int n = genres.length;
        for(int i=0;i<n;++i){
            //최초 삽입인경우 초기화, 값 삽입은 아래서 진행!
            if(!m1.containsKey(genres[i])){
                ArrayList<pair> tmp = new ArrayList<>();
                // tmp.add(new pair(plays[i],i));
                m1.put(genres[i],tmp);
                m2.put(genres[i],0);
            }
            var tmp = m1.get(genres[i]);
            tmp.add(new pair(i,plays[i]));
            m1.put(genres[i],tmp);
            m2.put(genres[i],m2.get(genres[i])+plays[i]);
        }
        // System.out.println(m1);
        // System.out.println(m2);
        
        //<장르, 재생횟수를 내림차순 정렬>
        var sortedGen = m2.entrySet().stream()
            .sorted((a,b)-> Integer.compare(b.getValue(), a.getValue()));
        
        // 정렬된 <장르, 재생횟수> 순회하면서
        sortedGen.forEach(e -> {
            // 내부 리스트에서 cnt기준 내림차순정렬, 2개 가져오기
            var sortedSong = m1.get(e.getKey()).stream()
                .sorted((a,b)->Integer.compare(b.cnt,a.cnt))
                .limit(2);
            // 가져온것의 index를 정답에 추가
            sortedSong.forEach(song -> ret.add(song.idx));
        });
        
        return ret.stream().mapToInt(Integer::intValue).toArray();
    }
}