알고리즘 & 자료구조/해시

[프로그래머스 알고리즘 고득점 Kit][해시][Java] 베스트앨범

수수다 2026. 3. 2. 16:58

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

 

프로그래머스

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

programmers.co.kr

 

이 문제는 알고리즘 초보자라면 꼭 풀어봐야할 문제 같았다.

정렬 기준이 여러 개,

여러 타입의 변수를 어떻게 관리할 것인가를 고민해볼 수 있는 문제

 

1. 정답 코드

필요한 데이터는 

노래 하나에 대해서 장르가 무엇인지

그 장르는 총 몇 회 플레이 되었는지

이 노래는 몇 회 플레이 되었는지

몇 번 노래인지

이렇게 뭐가 많이 필요할 때는 

가장먼저 클래스를 떠올리는 것같다.

배열로 어떻게 할 수는 있겠지만

그냥 편하니까.

그리고 조금 헷갈렸던 것이

장르당 2개씩 가져오는 것을 어떻게 하지?

고민했는데 그냥 해시맵 하나 더 만들어서 
 선택한 횟수를 관리하면 되는 거 였다.

import java.util.*;

class Solution {
    public int[] solution(String[] genres, int[] plays) {

	//장르별 총 횟수 구하기
        HashMap<String, Integer> genre = new HashMap<>();
        int songNum = genres.length;
        for(int i=0; i<songNum; i++){
            genre.put(genres[i], genre.getOrDefault(genres[i], 0) + plays[i]);
        }
	//각 노래에 대한 데이터 저장
        Song[] songs = new Song[songNum];
        for(int i=0; i<songNum; i++){
            songs[i] = new Song(genres[i], genre.get(genres[i]), plays[i], i);
        }
	// 주어진 정렬 조건에 대해서 정렬하기
        Arrays.sort(songs, (s1, s2) -> {
            if(s1.genrePlayCnt == s2.genrePlayCnt) {
                if(s1.songPlayCnt == s2.songPlayCnt) {
                    return Integer.compare(s1.index, s2.index);
                }
                return Integer.compare(s2.songPlayCnt, s1.songPlayCnt);
            }
            return Integer.compare(s2.genrePlayCnt, s1.genrePlayCnt);
        });
    
	//장르별 2개씩 고르기
        HashMap<String, Integer> pickCnt = new HashMap<>();
        ArrayList<Integer> ans = new ArrayList<>();
        for(int i=0; i<songNum; i++){
            int count = pickCnt.getOrDefault(songs[i].genre, 0);
            if(count == 2) continue;

            ans.add(songs[i].index);
            pickCnt.put(songs[i].genre, count + 1);
        }
        int[] answer = new int[ans.size()];
        for(int i=0; i<ans.size(); i++){
            answer[i] = ans.get(i);
        }
        return answer;
    }
    class Song {
        String genre;
        int genrePlayCnt;
        int songPlayCnt;
        int index;
        Song (String genre, int genrePlayCnt, int songPlayCnt, int index) {
            this.genre = genre;
            this.genrePlayCnt = genrePlayCnt;
            this.songPlayCnt = songPlayCnt;
            this.index = index;
        }
    }
}