[프로그래머스] 베스트앨범

NCOOKIE·2024년 5월 17일
0

알고리즘

목록 보기
15/34
public int[] solution(String[] genres, int[] plays) {
    Map<String, Integer> genrePlayCntMap = new HashMap<>();
    Map<String, Map<Integer, Integer>> songPlayMap = new HashMap<>();

    for (int i = 0; i < genres.length; i++) {
        // 장르별 재생수 카운트
        int oldScore = genrePlayCntMap.getOrDefault(genres[i], 0);
        genrePlayCntMap.put(genres[i], oldScore + plays[i]);

        // 해당 장르의 첫 번째 곡이라면 빈 HashMap 데이터 새로 할당
        // key: 인덱스, value: 해당 곡의 재생수를 가지는 Map 데이터 추가
        songPlayMap.computeIfAbsent(genres[i], k -> new HashMap<>()).put(i, plays[i]);
    }

    // 노래들의 재생수가 가장 많은 장르부터 내림차순 정렬
    ArrayList<String> keySet = new ArrayList<>(genrePlayCntMap.keySet());
    keySet.sort(((o1, o2) -> genrePlayCntMap.get(o2).compareTo(genrePlayCntMap.get(o1))));

    List<Integer> answerList = new ArrayList<>();
    int answerIndex = 0;
    for (String s : keySet) {
        // 인기 장르 순으로 추출
        Map<Integer, Integer> map = songPlayMap.get(s);

        ArrayList<Integer> integers = new ArrayList<>(map.keySet());
        integers.sort(((o1, o2) -> map.get(o2).compareTo(map.get(o1))));
        for (int playCnt : integers) {
            answerList.add(playCnt);
            if (answerIndex++ == 1)   break;    // 장르별 두 곡까지만 수록
        }
        answerIndex = 0;
    }

    return answerList.stream().mapToInt(Integer::intValue).toArray();
}

처음으로 프로그래머스 문제를 풀어보았다. 확실히 입출력 면에서는 백준보다 편한 것 같다. 프로그래머스 사이트에서 다른 사람들의 풀이를 봤는데 굉장히 화려하고 복잡해보였다. 백준처럼 실행시간 기준으로 볼 수 있으면 좋겠다는 생각이 들었다.

어쨌든 로직 자체를 생각하는 것은 별로 걸리지 않았는데 내가 해시에 익숙하지 않아 시간이 좀 걸렸다. (1시간 정도) 내 개발 실력이 한참 부족하다는 것을 체감했다. 좀 더 열심히 하자.

profile
일단 해보자

0개의 댓글

관련 채용 정보