본문 바로가기
CodingTest/Programmers

[Programmers] 베스트앨범

by 창브로 2025. 4. 1.

[문제 링크]

https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 

[풀이 과정]

일단 장르의 모든 노래 재생 횟수를 저장하고 노래 재생 횟수에 따라 정렬합니다.또한 장르와 노래 번호, 노래 재생 횟수를 저장합니다.

 

위에서 정렬했던 장르 순서대로 장르를 뽑아 장르별 노래 재생 횟수에 따라 정렬하여 답을 도출합니다.코드 주석으로 보시면 좀 더 쉬울 것 같습니다.

 

[코드]

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Integer> genrePlayCount = new HashMap<>();
        Map<String, Map<Integer, Integer>> musicPlayCount = new HashMap<>();
        
        for(int i = 0; i < plays.length; i++) {
            // 장르를 Key로 두고 Value에 그 장르의 모든 음악 재생 횟수를 저장 
           genrePlayCount.put(genres[i], genrePlayCount.getOrDefault(genres[i], 0) + plays[i]);
            
            // 장르를 Key로 두고 Value에 Map<음악 번호(idx), 음악 횟수>를 넣는다.
            // Value Map을 보면 Key에는 음악 번호(idx) Value에는 음악 횟수가 들어간다고 보면 된다.
            if(!musicPlayCount.containsKey(genres[i])) {
                Map<Integer, Integer> map = new HashMap<>();
                
                map.put(i, plays[i]);
                
                musicPlayCount.put(genres[i], map);
            } else {
                musicPlayCount.get(genres[i]).put(i, plays[i]);
            }
        }
        
        // 장르 총 재생 횟수를 저장한 Key들을 꺼내서 정렬을 위해 ArrayList로 저장
        ArrayList<String> topPlayGenders = new ArrayList<>(genrePlayCount.keySet());
        
        // 내림차순 정렬
        topPlayGenders.sort((g1, g2) -> genrePlayCount.get(g2) - genrePlayCount.get(g1));
        
        
        ArrayList<Integer> answer = new ArrayList<>();
        
        // 가장 인기 많은 장르부터 for문 시작
        for(String genre : topPlayGenders) {
            // 장르의 노래들을 추출 Map<노래 번호(idx), 노래 재생 횟수>
            Map<Integer, Integer> topPlayMusics = musicPlayCount.get(genre);
            
            // 정렬을 위해 ArrayList로 변환
            ArrayList<Integer> musicIdx = new ArrayList<>(topPlayMusics.keySet());
            
            // 내림차순 정렬
            musicIdx.sort((m1, m2) -> topPlayMusics.get(m2) - topPlayMusics.get(m1));
            
            // 노래 1개 저장
            answer.add(musicIdx.get(0));
            // 노래가 2개 이상이면 하나 더 저장
            if(musicIdx.size() > 1) {
                answer.add(musicIdx.get(1));
            }
            
        }
        
        
        return answer.stream().mapToInt(i -> i).toArray();
    }
}

[회고]

풀이는 쉬웠지만 Java 문법이 많이 어려웠습니다. 람다식과 Map, List를 정렬하고 다루는 것에 대한 공부를 더 열심히하고시간날때 다시 한 번 풀어보며 문법을 점검하는 시간을 가지면 좋을 것 같습니다.

 

 

 

 

질문과 피드백은 언제나 환영입니다.

감사합니다.

'CodingTest > Programmers' 카테고리의 다른 글

[Programmers] 올바른 괄호  (1) 2025.04.03
[Programmers] 기능개발  (0) 2025.04.03
[Programmers] 의상  (1) 2025.03.29
[Programmers] 전화번호 목록  (0) 2025.03.28
[Programmers] 포켓몬  (1) 2025.03.27