티스토리 뷰

728x90
 

코딩테스트 연습 - 베스트앨범

스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

programmers.co.kr

풀이 과정

1. HashMap을 통해 genres[] 를 Key별  plays[]를 Value  genresMap을 만든다 

ex) {pop=3100, classic=1450}

2. 키별 재생횟수 기준으로 내림 차순을 정렬 

3. 반복문을 통해 장르별 playMap을 만든다 <idx, playCount>

4. 3번을 재생횟수 내림차순 정렬해준다.

5. !! 곡은 두개만 실을 수 있다. list.size()>1 이라면 더이상 결과값에 넣어주지 않는다.

 

package programmers.level3;

import org.junit.Test;

import java.util.*;

public class P42579 {
    @Test
    public void 정답() {
        String[] genres = {"classic", "pop", "classic", "classic", "pop"};
        int[] plays = {500, 600, 150, 800, 2500};
        System.out.println(Arrays.toString(solution(genres, plays)));
    }

    public int[] solution(String[] genres, int[] plays) {
        int[] answer = {};
        HashMap<String, Integer> genresMap = new HashMap<>();
        for (int i = 0; i < genres.length; i++) {
            genresMap.put(genres[i], genresMap.getOrDefault(genres[i], 0) + plays[i]);
        }
        List<String> genresList = new ArrayList<>(genresMap.keySet());
        Collections.sort(genresList, (o1, o2) -> genresMap.get(o2) - genresMap.get(o1));

        ArrayList<Integer> answerList = new ArrayList<>();
        for (String s : genresList) {
            HashMap<Integer, Integer> playsMap = new HashMap<>();
            for (int i = 0; i < genres.length; i++) {
                if (s.equals(genres[i])) {
                    playsMap.put(i, plays[i]);
                }
            }
            List<Integer> playList = new ArrayList<>(playsMap.keySet());
            Collections.sort(playList, (o1, o2) -> playsMap.get(o2) - playsMap.get(o1));
            int j = 0;
            for (Integer i : playList) {
                if (j > 1) {
                    break;
                }
                answerList.add(i);
                j++;
            }
        }
        answer = answerList.stream().mapToInt(i -> i).toArray();
        return answer;
    }
}
댓글
최근에 달린 댓글
최근에 올라온 글
Total
Today
Yesterday
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31