프로그래머스 - 베스트앨범 - HashMap - Java

chaemin·2024년 7월 20일
0

프로그래머스

목록 보기
61/64

1. 문제

2. 풀이

전체적으로 풀다가 5~14번 테스트 케이스만 틀리길래 질문하기를 통해서 그 답을 찾았다... 참고 풀이

문제를 좀 더 꼼꼼히 읽어야 했다......

나의 접근법은

map<String, ArrayList<Play>>라는 코드를 통해 접근하였다.
class : (0번, 500), (2번, 150), (3번, 800)
pop : (1번, 600), (4번, 2500)

그리고 sumMap을 두어 각 장르의 play합들을 저장하는 map을 선언하였다.
class : 1450
pop : 3100

그 이후 각 map들의 key의 ArrayList를 sort해주었다.
그리고 maxList<>를 두어 가장 많이 재생된 항목을 찾도록 하였다. 이후 maxList를 sort하게 되면 가장 많이 재생된 항목별로 나오게 되며

for문으로 maxList를 순차 탐색하면서 최대 2개씩만 넣어주도록 하였다.

3. 전체 코드

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int n = genres.length;
        int[] answer = {};
        Map<String, ArrayList<Play>> map = new HashMap<>();
        Map<String, Integer> sumMap = new HashMap<>();
        
        for(int i = 0; i < n; i++){
            if(!map.containsKey(genres[i])){
                map.put(genres[i], new ArrayList<Play>());
            }
            map.get(genres[i]).add(new Play(i, plays[i]));
            sumMap.put(genres[i], sumMap.getOrDefault(genres[i], 0) + plays[i]);
        }
        
        ArrayList<maxPlay> maxList = new ArrayList<>();
        
        for(String key : map.keySet()){
            Collections.sort(map.get(key));
            
            maxList.add(new maxPlay(key, sumMap.get(key)));
        }
        
        Collections.sort(maxList);
        
        ArrayList<Integer> answerList = new ArrayList<>();
        
        for(int i = 0; i < maxList.size(); i++){
            String gen = maxList.get(i).gen;
            int maxIndex = (map.get(gen).size()) >= 2 ? 2 : map.get(gen).size();
            
            for(int j = 0; j < maxIndex; j++){
                answerList.add(map.get(gen).get(j).num);
            }
        }
        
        return answerList.stream().mapToInt(Integer::intValue).toArray();
    }
    
    public class Play implements Comparable<Play>{
        int num;
        int play;
        
        public Play(int num, int play){
            this.num = num;
            this.play = play;
        }
        
        @Override
        public int compareTo(Play other){
            return Integer.compare(other.play, this.play);
        }
    }
    
    public class maxPlay implements Comparable<maxPlay>{
        String gen;
        int maxplay;
        
        public maxPlay(String gen, int maxplay){
            this.gen = gen;
            this.maxplay = maxplay;
        }
        
        @Override
        public int compareTo(maxPlay other){
            return Integer.compare(other.maxplay, this.maxplay);
        }
    }
}

0개의 댓글