티스토리 뷰

728x90

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

프로그래머스 코딩테스트 고득점 Kit의 Hash Level 3 문제다.

 

 

  1. 속한 노래가 많이 재생된 장르를 먼저 수록합니다.
  2. 장르 내에서 많이 재생된 노래를 먼저 수록합니다.
  3. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다.

 

문제에 나온 노래의 수록 기준은 위와 같다.

 

 

먼저 1번 기준을 만족하기 위해 장르별 재생횟수를 HashMap에 저장한다.

stream을 통해 HashMap을 정렬하는 기본적인 방식은 오름차순이지만,

재생횟수가 많은 장르별로 HashMap을 정렬(내림차순)해야 하므로

재생횟수를 음수값으로 변경해 저장했다.

 

2번 기준을 만족하기 위해 for문을 통해 많이 재생된 장르별로 노래를 List에 저장한다. 

장르 내에서 많이 재생된 노래를 먼저 수록하는 것이므로

List를 내림차순 정렬 후 가장 앞 2개의 노래만 result에 저장한다. (장르별 곡이 1개일 경우 하나만)

 

이 때 for문을 통해 고유번호가 낮은 노래부터 접근하기 때문에

3번 기준도 자동으로 만족한다.

 

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        HashMap<String, Integer> gMap = new HashMap<>();
            
        for(int i=0;i<genres.length;i++) 
            gMap.put(genres[i], gMap.getOrDefault(genres[i], 0) - plays[i]);
        
        List<Map.Entry<String, Integer>> entries = gMap.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toList());
        
        ArrayList<Integer> result = new ArrayList<>();
        ArrayList<int[]> pList;
        
        for(Map.Entry<String, Integer> entry : entries) {
            pList = new ArrayList<>();
            
            for(int i=0;i<genres.length;i++) {
                if(genres[i].equals(entry.getKey())) 
                    pList.add(new int[] {plays[i], i});
            }
            
            pList.sort((o1, o2) -> o2[0] - o1[0]);
            
            result.add(pList.get(0)[1]);
            if(pList.size() > 1)
                result.add(pList.get(1)[1]);
            
        }
        
        int[] ans = new int[result.size()];
        for(int i=0;i<ans.length;i++) 
            ans[i] = result.get(i);
        
        return ans;
    }
}
728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/03   »
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
글 보관함