https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
HashMap을 활용하여 Genre가 이미 존재하는지 확인하고
Music은 새로 받을때마다 하나의 객체를 만들어주고
Genre에 존재하는 pq에 집어넣어주면서 자동정렬해주었다.
관건은 HashMap을 정렬하는데서 오류가 발생하였고
Collections.sort로 정렬하려 하였으나 Map과 Set같은 경우
List 형태가 아니어서 정렬이 불가능하다는것을 알았다.
HashMap에 존재하는 values() Method를 활용하여
List로 장르를 받아주고 그상태로 정렬하였다. 어차피 장르의
번호나 이름은 중요하지 않았기에 가능했다.
// 장르별 두곡 모아 베스트 앨범 출시
// class genre {
// class music 사용
import java.util.*;
class Solution {
class Genre {
int totPlays = 0;
PriorityQueue<Music> pq = new PriorityQueue<>((m1, m2) -> {
if (m1.plays == m2.plays)
return m1.id - m2.id;
return m2.plays - m1.plays;
});
public void add(Music m) {
pq.add(m);
totPlays += m.plays;
}
}
class Music {
int id;
int plays;
public Music(int id, int plays) {
this.id = id;
this.plays = plays;
}
}
public int[] solution(String[] genres, int[] plays) {
HashMap<String, Genre> map = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
map.putIfAbsent(genres[i], new Genre());
map.get(genres[i]).add(new Music(i, plays[i]));
}
List<Genre> sorted = new ArrayList<>(map.values());
sorted.sort((g1, g2) -> g2.totPlays - g1.totPlays);
List<Integer> ans = new ArrayList<>();
for (Genre g : sorted) {
int cnt = 0;
while (!g.pq.isEmpty() && cnt < 2) {
ans.add(g.pq.poll().id);
cnt++;
}
}
return ans.stream().mapToInt(i -> i).toArray();
}
}
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 3. 보석 쇼핑 (3) | 2024.10.05 |
---|---|
Lv 3. 스티커 모으기 (2) | 2024.10.03 |
Lv 2. 다리를 지나는 트럭 (0) | 2024.10.01 |
Lv 3. 기지국 설치 (0) | 2024.09.30 |
Lv 3. 단속카메라 (1) | 2024.09.29 |