문제

  • 링크
    title: "코딩테스트 연습 - 베스트앨범"
    image: "https://image.freepik.com/free-vector/landing-page-template-for-a-website_23-2147782747.jpg"
    description: "스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다."
    url: "https://school.programmers.co.kr/learn/courses/30/lessons/42579"
    

문제 풀이

문제 접근

  • 해시맵 사용
  • 아래와 같음

    간단한 수도 코드 정리

    ```pseudocode

    1. 각 장르별 총 재생 횟수 계산:
    • genreCount[장르] = 총 재생 횟수
  1. 각 장르별 상위 2개의 곡 찾기:
    • map[장르] = [가장 많이 재생된 곡들 (최대 2곡)]
  2. 장르별로 총 재생 횟수 내림차순 정렬:
    • genreRank = 장르 리스트를 genreCount 기준으로 내림차순 정렬
  3. 결과 리스트에 상위 곡들의 인덱스 추가:
    • for (장르 in genreRank) {
      • for (곡 in map[장르]) {
        • 결과 리스트에 곡의 인덱스를 추가
        • 해당 곡의 인덱스는 이미 선택된 곡으로 처리 } }
  4. 결과 리스트를 배열로 변환하여 반환:
    • return 결과 리스트를 배열로 변환

---
## 풀이 코드
```java
import java.util.*;
import java.util.stream.Collectors; // 추가

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap<String, List<Integer>> map = new HashMap<>();
        HashMap<String, Integer> genreCount = new HashMap<>();
        List<Integer> playList = Arrays.stream(plays)
                               .boxed() // int를 Integer로 변환
                               .collect(Collectors.toList()); // 리스트로 변환

        
        // set map
        for (int i = 0; i < genres.length; i++) {
            // genresCount
            if (genreCount.containsKey(genres[i])) {
                genreCount.put(genres[i], genreCount.get(genres[i]) + plays[i]);
            } else {
                genreCount.put(genres[i], plays[i]);
            }
            
            // map
            if (map.containsKey(genres[i])) {
                if (map.get(genres[i]).size() < 2) {
                    map.get(genres[i]).add(plays[i]);
                    Collections.sort(map.get(genres[i]), Collections.reverseOrder());
                } else {
                    if (plays[i] > map.get(genres[i]).get(0)) {
                        map.get(genres[i]).add(0, plays[i]);
                        map.get(genres[i]).remove(2);
                    } else if (plays[i] > map.get(genres[i]).get(1)) {
                        map.get(genres[i]).add(1, plays[i]);
                        map.get(genres[i]).remove(2);
                    }
                }
                
            } else {
                List<Integer> list = new ArrayList<>();
                list.add(plays[i]);
                map.put(genres[i], list);
            }
        }
        
        // sort genreCount
        List<String> genreRank = new ArrayList<>(genreCount.keySet());
        
        genreRank.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return genreCount.get(o2).compareTo(genreCount.get(o1));
            }     
        });
        
        List<Integer> result = new ArrayList<>();
        for (String gen : genreRank) {
            for (Integer play : map.get(gen)) {
                result.add(playList.indexOf(play));
                playList.set(playList.indexOf(play), -1);
            }
        }
        
        answer = result.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}