알고리즘 & 자료구조/해시
[프로그래머스 알고리즘 고득점 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;
}
}
}