본문 바로가기

Development/CodingTest

[Hash] 프로그래머스 level 3 베스트앨범 java 풀이

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

 

프로그래머스

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

programmers.co.kr

문제 접근

  1. <장르, 그 장르의 총 플레이 수> 를 저장하는 totalGenresPlay 
  2. <장르, <고유번호, 플레이 수> > 를 저장하는 musicTable 
  3. 위 두 HashMap을 for loop로 생성
  4. 속한 노래가 많이 재생된 장르를 먼저 수록하기 위해, totalGenresPlay의 value값 기준으로 내림차순 sort하여 장르(String)을 저장하는 새 sortedKeyList 생성
  5. sortedKeyList를 순회하면서 musicTable의 저장된 장르의 HashMap<고유번호, 플레이 수> 를 불러오고
  6. 플레이 수 기준으로 내림차순 정렬한다.
  7. 2개의 곡을 뽑고 answer에 넣는다.

코드

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        List<Integer> answer = new ArrayList<>();

        HashMap<String, Integer> totalGenresPlay = new HashMap<>();
        HashMap<String, HashMap<Integer, Integer>> musicTable = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            if (!totalGenresPlay.containsKey(genres[i])) {
                totalGenresPlay.put(genres[i], plays[i]);

                HashMap<Integer, Integer> newMusic = new HashMap<>();
                newMusic.put(i, plays[i]);
                musicTable.put(genres[i], newMusic);
            } else {
                musicTable.get(genres[i]).put(i, plays[i]);
                totalGenresPlay.put(genres[i], totalGenresPlay.get(genres[i]) + plays[i]);
            }
        }

        List<String> sortedKeyList = new ArrayList<>(totalGenresPlay.keySet());
        sortedKeyList.sort((s1, s2) -> totalGenresPlay.get(s2) - (totalGenresPlay.get(s1)));

        for (String genre : sortedKeyList) {
            HashMap<Integer, Integer> music = musicTable.get(genre);
            List<Integer> musicPlays = new ArrayList<>(music.keySet());
            musicPlays.sort((s1, s2) -> music.get(s2) - (music.get(s1)));

            answer.add(musicPlays.get(0));
            if (musicPlays.size() > 1) {
                answer.add(musicPlays.get(1));
            }
        }

        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}