코딩 테스트

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

로승리 2022. 10. 20. 17:52

한번에 로직이 세워지지 않았던 문제이다.

HashMap에 익숙해졌다고 생각했지만 values를 기준으로 내림차순 정렬하는데 어려움을 겪었다.

 


로직

먼저 genres와 play값을 HashMap에 넣어 각 장르별 플레이 횟수를 센다.

그리고 keySet을 리스트에 넣어 플레이 횟수별로 내림차순 정렬한다.

정렬된 list의 값을 순회하면서 첫번째와 두번째로 많이 재생된 노래의 인덱스를 result 리스트에 넣고

마지막으로 배열로 복사해서 반환하면 된다.

 

최종 코드

import java.util.*;
class Solution {
    public int[] solution(String[] genres, int[] plays) {
         List<Integer> result = new ArrayList<>();

        // 각 장르별로 HashMap에 넣기
        HashMap<String, Integer> genreMap = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            genreMap.put(genres[i], genreMap.getOrDefault(genres[i], 0) + plays[i]);
        }

        // keySet을 value 기준으로 내림차순 정렬
        List<String> list = new ArrayList<>(genreMap.keySet());
        Collections.sort(list, (o1, o2) -> genreMap.get(o2) - genreMap.get(o1));

        for (int i = 0; i < list.size(); i++) {

            String s = list.get(i);

            // 첫번째로 많이 재생된 노래 찾기
            int firstMax = 0;
            int firstIdx = -1;

            for (int j = 0; j < genres.length; j++) {
                if (genres[j].equals(s) && firstMax < plays[j]) {
                    firstMax = Math.max(firstMax, plays[j]);
                    firstIdx = j;
                }
            }

            // 두번째로 많이 재생된 노래 찾기
            int secondMax = 0;
            int secondIdx = -1;
            for (int j = 0; j < genres.length; j++) {
                if (genres[j].equals(s) && secondMax < plays[j] && j != firstIdx) {
                    secondMax = plays[j];
                    secondIdx = j;
                }
            }
            // 재생된 노래 리스트에 저장
            result.add(firstIdx);
            // 두번째로 재생된 노래가 있다면 리스트에 저장
            if (secondIdx >= 0) {
                result.add(secondIdx);
            }
        }

        // 리스트값 배열로 복사
        int[] answer = new int[result.size()];
        for (int i = 0; i < result.size(); i++) {
            answer[i] = result.get(i);
        }

        return answer;
    }
}