[프로그래머스(Programmers)] 베스트앨범 (java)

3
post-thumbnail

안녕하세요. 오늘은 프로그래머스의 베스트앨범 문제를 풀어보겠습니다.


1. 문제 링크

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

2. 문제 풀이

✔ 1) 장르 별 전체 재생 횟수 count

key가 String(장르), value가 Integer(총 횟수)인 hashMap에 저장하면서 각 장르별로 재생된 총 횟수를 셉니다.

✔ 2) 1에서 count한 map sort

위에서 count한 map의 key값을 따로 keySet에 저장합니다. 그 후 저장된 key를 value값을 기준으로 내림차순 sort해줍니다.
예를 들어, 아래와 같은 map에 해당 로직을 수행하면

장르횟수
classic1450
pop3100

다음과 같은 결과가 도출됩니다.

결과
pop
classic

✔ 3) key가 genre배열의 index이고 value가 각 재생횟수인 map 생성

2의 수행 결과값을 토대로 key가 genre index이고 value가 각 재생횟수인 map 생성합니다. 그 후 해당 map의 key를 2번과 같은 방식으로 sort합니다.(keySet을 map의 value로 내림차순 정렬)

✔ 4) 3에서 생성된 keySet의 상위 2개만 answer에 저장

한 장르에서 재생된 노래가 여러 개라면, 그 노래들 중 가장 많이 재생된 2개의 노래만 answer배열에 저장합니다.

3. 전체 코드

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer;
        int arrLen = genres.length;

        List<Integer> arrAnswer = new ArrayList<>();
        Map<String, Integer> totalAmount = new HashMap<>();

        for (int i = 0; i < arrLen; i++) {
            totalAmount.put(genres[i], totalAmount.getOrDefault(genres[i], 0) + plays[i]);
        }

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

        for (String key : keySet) {
            Map<Integer, Integer> hMap = new HashMap<>();

            for (int i = 0; i < genres.length; i++) {
                if (key.equals(genres[i])) {
                    hMap.put(i, plays[i]);
                }
            }

            List<Integer> hMapKeySet = new ArrayList<>(hMap.keySet());
            hMapKeySet.sort((s1, s2) -> hMap.get(s2).compareTo(hMap.get(s1)));

            int j = 0;

            for (int c : hMapKeySet) {
                if (j > 1) break;

                arrAnswer.add(c);
                j++;
            }
        }

        answer = new int[arrAnswer.size()];

        for (int i = 0; i < arrAnswer.size(); i++) {
            answer[i] = arrAnswer.get(i);
        }

        return answer;
    }
}

4. 느낀점

✔ 람다식으로 compareTo 사용하기

최근 책을 읽으면서 람다식에 익숙해지는 연습중이어서 compareTo를 람다식으로 써보려고 노력했다.

두 가지 모두 같은 결과를 도출한다!

Collections.sort(keySet, (s1, s2) -> map.get(s2).compareTo(map.get(s1)));

keySet.sort((s1, s2) -> map.get(s2).compareTo(map.get(s1)));


[참고한 곳]
https://junghn.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%B2%A0%EC%8A%A4%ED%8A%B8%EC%95%A8%EB%B2%94-%ED%95%B4%EC%8B%9C

0개의 댓글