본문 바로가기

알고리즘 공부 및 문제 풀이/프로그래머스(PRO)

[pro] 프로그래머스 level3 42579 베스트앨범 (Java) - 해쉬

[문제]

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

[풀이]

HashMap을 이용한 연산을 통해 해결 가능.

 

[코드]

 

import java.util.*;
class Solution {
    Map<String, Integer> hs = new HashMap<>(); //장르별 총 재생횟수
    Map<String, Map<Integer, Integer>> music = new HashMap<>(); //장르별 고유번호와 재생횟수
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        for(int i=0; i<genres.length; i++){ 
            hs.put(genres[i], hs.getOrDefault(genres[i], 0)+plays[i]);
            if(music.containsKey(genres[i])){
                music.get(genres[i]).put(i, plays[i]);
            }
            else{
                Map<Integer, Integer> temp = new HashMap<>();
                temp.put(i, plays[i]);
                music.put(genres[i], temp);
            }
        }
        
        List<Integer> answers = new ArrayList<>();
        
        List<String> keyList = new ArrayList(hs.keySet());
        Collections.sort(keyList, (o1, o2) -> hs.get(o2)-hs.get(o1)); //많이 재생된 장르 순으로 정렬
        int idx = 0;
        for(String key:keyList){
            Map<Integer,Integer> map = music.get(key);
            List<Integer> keys = new ArrayList(map.keySet());
            Collections.sort(keys, (o1, o2)->map.get(o2)-map.get(o1)); //많이 재생된 곡 순으로 정렬
            answers.add(keys.get(0));
            if(keys.size()>1){
                answers.add(keys.get(1));
            }
        }
        
        answer = answers.stream().mapToInt(i->i).toArray();
        
        return answer;
    }
    
    
}