Google 태그 관리자 아이콘

알고리즘 풀이

.programmers(베스트앨범)

silvergoni 2022. 4. 7. 17:44
반응형

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

 

1. 2022.04.07 시도

소요시간: 44분

import java.util.*;
import java.util.Map.Entry;

class Solution {
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Map<Integer, Integer>> songMap = new HashMap<>();
        Map<String, Integer> genreMap = new HashMap<>();
        for(int i=0; i<genres.length; i++) {
            String genre = genres[i];
            Integer playCount = plays[i];
            Map<Integer, Integer> tempMap = songMap.getOrDefault(genre, new HashMap<>());
            tempMap.put(i, playCount);
            songMap.put(genre, tempMap);
            genreMap.put(genre, genreMap.getOrDefault(genre, 0) + playCount);
        }

        List<Map.Entry<String, Integer>> genreList = new ArrayList<>(genreMap.entrySet());
        genreList.sort(Map.Entry.comparingByValue());
        Collections.reverse(genreList);

        List<Integer> answer = new ArrayList<>();
        for (Map.Entry<String, Integer> entry: genreList) {
            String genre = entry.getKey();
            Map<Integer, Integer> tempMap = songMap.get(genre);

            List<Map.Entry<Integer, Integer>> songList = new ArrayList<>(tempMap.entrySet());
            Collections.sort(songList, (o1, o2) -> {
                int ret = o1.getValue().compareTo(o2.getValue()) * -1;
                if (ret == 0) {
                    return o1.getKey().compareTo(o2.getKey());
                }

                return ret;
            });

            int limit = 0;
            for (Map.Entry<Integer, Integer> songEntry: songList) {
                if (limit < 2) {
                    answer.add(songEntry.getKey());
                    limit++;
                }
            }
        }
        
        int counter = 0;
        int[] ret = new int[answer.size()];
        for (Integer each: answer) {
            ret[counter++] = each;
        }

        return ret;
    }
}

풀이 접근 과정

일단 필요한 정보를 Map으로 저장한다.

저장된 Map을 정렬하고 순서를 List에 저장한다.

배열에 맞게 List를 다시 넣어준다.

 

느낀점

  • 이상하게 홀리는 느낌이다. leetcode에서 풀었던 쉬웠던걸까. 이상하게 한글이 더 눈에 안들어오는 착시가 있고 문제가 내기준 손이 많이 간다.
  • 프로그래머스는 import도 잘 알아두는게 중요하다.
  • 이번에 Map을 value기준으로 소팅하는 법을 제대로 배웠다. entrySet과 List, Collections.sort를 이용하는데 간추리면 아래와 같다.
Map<String, Integer> map = new HashMap<>();
List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
Collections.sort(list, (o1,o2)-> {
    return o1.getValue().compareTo(o2.getValue());	//오름차순
});

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형

 

'알고리즘 풀이' 카테고리의 다른 글

.programmers(프린터)  (0) 2022.04.08
.programmers(기능개발)  (0) 2022.04.08
.programmers(위장)  (0) 2022.04.07
.programmers(전화번호 목록)  (0) 2022.04.07
.programmers(완주하지 못한 선수)  (0) 2022.04.07