https://school.programmers.co.kr/learn/courses/30/lessons/42579?language=java
단순 해쉬문제입니다.
우선순위큐를 활용하여 가장 많이 플레이한 장르를 알려주고 (우선순위큐 사용안하고 Collections.sort() 를 사용해도됨)
그 장르에서 1순위로 많이 들은 노래, 2순위로 많이 들은 노래를 구해서
리턴하면 됩니다.
코드입니다.
import java.util.*;
import java.util.Map.*;
class Solution {
HashMap<String, Integer> hashmap = new HashMap<>();
PriorityQueue<Genre> pq = new PriorityQueue<Genre>();
ArrayList<Integer> answerarr = new ArrayList<>();
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
for(int i=0;i<genres.length;i++){
hashmap.put(genres[i], hashmap.getOrDefault(genres[i], 0) + plays[i]);
}
for(Map.Entry<String, Integer> entry : hashmap.entrySet()){
pq.offer(new Genre(entry.getKey(), entry.getValue()));
}
while(!pq.isEmpty()){
String genretemp = pq.poll().genrename;
int maxplaytime = 0;
int firstidx = -1;
//첫번째로 많이 들었던 음악 찾기
for(int i=0;i<genres.length;i++){
if(genres[i].equals(genretemp)){
if(maxplaytime < plays[i]){
maxplaytime = plays[i];
firstidx = i;
}
}
}
answerarr.add(firstidx);
//두번쨰로 많이 들었던 음악찾기
maxplaytime = 0;
int secondidx = -1;
for(int i=0;i<genres.length;i++){
if(genres[i].equals(genretemp) && i != firstidx){
if(maxplaytime < plays[i]){
maxplaytime = plays[i];
secondidx = i;
}
}
}
if(secondidx != -1){
answerarr.add(secondidx);
}
}
answer = new int[answerarr.size()];
for(int i=0;i<answerarr.size();i++){
answer[i] = answerarr.get(i);
}
return answer;
}
class Genre implements Comparable<Genre>{
String genrename;
int playtime;
Genre(String genrename, int playtime){
this.genrename = genrename;
this.playtime = playtime;
}
public int compareTo(Genre other){
if(this.playtime < other.playtime){
return 1;
}else{
return -1;
}
}
}
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]올바른 괄호 - 스택 (0) | 2023.02.03 |
---|---|
[프로그래머스]기능개발- 구현 (0) | 2023.02.02 |
[프로그래머스][다시풀기]위장 - 해쉬 + 아이디어 (0) | 2023.02.01 |
[프로그래머스]전화번호 목록 - 해쉬 + 아이디어 (0) | 2023.01.28 |
[프로그래머스]이진 변환 반복하기 - 문자열 + StringBuilder (0) | 2023.01.25 |