본문 바로가기
알고리즘/문제 풀이

프로그래머스: 베스트앨범

by 위대한초밥V 2023. 10. 17.

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

 

프로그래머스

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

programmers.co.kr

설명

처음에는 하나의 map만 사용해서 정렬을 하려고 했으나, HashMap을 두개 생성해서 장르 별 플레이된 횟수를 저장하는 방식을 택했다. 

 

Map<String, Map<Integer, Integer>> map = new HashMap<>();  // 장르별로 음악 정보(고유 번호: 플레이횟수) 저장
Map<String, Integer> genre = new HashMap<>();  // 장르별 플레이 횟수 저장

 

for(int i = 0; i < genres.length; i++) {
            Map<Integer, Integer> getMap = (HashMap) map.getOrDefault(genres[i], new HashMap<>());
            getMap.put(i, plays[i]);
            map.put(genres[i], getMap);   // 장르별 음악 정보 map에 장르에 따른 음악 정보를 저장한다.
            genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);  // 장르별 플레이 횟수를 저장한다.
}

 

// 장르별 플레이 횟수를 기준으로 정렬한다.

List<String> keySet = new ArrayList<>(genre.keySet());        
keySet.sort(new Comparator<String>() {
   @Override
   public int compare(String o1, String o2) {
       return genre.get(o2) - genre.get(o1);  // 내림차순 정렬
   }
});

 

// 장르별 플레이 횟수를 기준으로 정렬된 값을 가지고, 각 장르의 음악들을 정렬하고, 2개까지 저장한다.

for(String key : keySet) {
       Map<Integer, Integer> musics = (HashMap) map.get(key);
       List<Integer> musicKey = new ArrayList<>(musics.keySet());
       musicKey.sort(new Comparator<Integer>() {
              @Override
               public int compare(Integer o1, Integer o2) {
                    return musics.get(o2) - musics.get(o1);
               }
      });
            
      if(musicKey.size() == 1) {
           answer.add(musicKey.get(0));
      }
      else {
           for(int i = 0; i < 2; i++) {
               answer.add(musicKey.get(i));
          }
     }
  }

 

코드

import java.util.*;

class Solution {
    public List<Integer> solution(String[] genres, int[] plays) {
        List<Integer> answer = new ArrayList<>();
        
        Map<String, Object> map = new HashMap<>();
        Map<String, Integer> genre = new HashMap<>();
        
        for(int i = 0; i < genres.length; i++) {
            Map<Integer, Integer> getMap = (HashMap) map.getOrDefault(genres[i], new HashMap<>());
            getMap.put(i, plays[i]);
            map.put(genres[i], getMap);
            
            genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);
        }
        
        List<String> keySet = new ArrayList<>(genre.keySet());
        
        keySet.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return genre.get(o2) - genre.get(o1);
            }
        });
        
        for(String key : keySet) {
            Map<Integer, Integer> musics = (HashMap) map.get(key);
            List<Integer> musicKey = new ArrayList<>(musics.keySet());
            musicKey.sort(new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return musics.get(o2) - musics.get(o1);
                }
            });
            
            if(musicKey.size() == 1) {
                answer.add(musicKey.get(0));
            }
            else {
                for(int i = 0; i < 2; i++) {
                    answer.add(musicKey.get(i));
                }
            }
        }
        
        return answer;
    }
}
반응형