https://school.programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
ํธ๋ ๋์ ์ฌ๊ณ ๊ณผ์ ๋ฐ ๊ฐ์ ์
import java.util.*;
class Solution {
public int[] solution(String[] genres, int[] plays) {
ArrayList<Integer> arr = new ArrayList();
HashMap<String, PriorityQueue<Song>> s = new HashMap();
HashMap<String, Integer> g = new HashMap();
for(int i = 0; i < genres.length; i++){
g.put(genres[i], g.getOrDefault(genres[i], 0)+plays[i]); // ์๋ ์ฅ๋ฅด๋ณ ์ด ์ฌ์ ์ ๋ฃ๊ฒ
s.putIfAbsent(genres[i], new PriorityQueue<Song>((o1,o2)->{
if(o2.plays == o1.plays){
// ์ฌ์์๊ฐ ๊ฐ์ผ๋ฉด id๊ฐ ๋ฎ์๊ฑธ๋ก ์ ๋ ฌ
return o1.id - o2.id;
}
return o2.plays-o1.plays;
}));
s.get(genres[i]).add(new Song(i, plays[i]));
} // ์
๋ ฅ์ ๋ฐ์๋ค. ๊ฐ ์ฅ๋ฅด ๋ณ๋ก plays ์ ๋ด๋ฆผ์ ๋ ฌ, plays๊ฐ ๊ฐ์ผ๋ฉด id ์ค๋ฆ์ ๋ ฌ.
// ๊ฐ ์ฅ๋ฅด ๋ณ๋ก 2๊ฐ์ฉ ๋ฝ์ผ๋ฉด ๋๋๋ฐ, 1๊ฐ๋ง ์๋ค๋ฉด ๊ทธ๊ฑฐ๋ง ์ ํํ๋ค
// ๋ง์ด ์ฌ์๋ ์ฅ๋ฅด๋ฅผ ๋จผ์ ์๋กํ๋ค -> ์ด๊ฒ ์ข ์ ๋งค
// ํค-๊ฐ ์์ List๋ก ๋ณํ
List<Map.Entry<String, Integer>> list = new ArrayList(g.entrySet());
// value๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
for(Map.Entry<String, Integer> entry: list){
// ์ฌ์ ์๋ก ์ ๋ ฌ๋ ํค๋ฅผ ๊ฐ๋ค๊ฐ
String genre = entry.getKey();
int cnt = 0;
while(cnt < 2){
if(!s.get(genre).isEmpty()){
// ๋ฆฌ์คํธ๊ฐ ๋จ์์์ผ๋ฉด
arr.add(s.get(genre).poll().id);
cnt++;
}else{
// ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ
break;
}
}
}
int[] answer = new int[arr.size()];
int idx = 0;
for(int id: arr){
answer[idx++] = id;
}
return answer;
}
}
class Song{
int id;
int plays;
Song(int id, int plays){
this.id = id;
this.plays = plays;
}
}
IDE์์ฐ๊ณ ๊ทธ๋ฅ ๋ฐ๋ก ํ์๋ค. Map ์กฐ์์ ์กฐ๊ธ ์ต์ํด์ง ๊ฒ ๊ฐ๋ค.
์กฐ๊ฑด์ด ์ข ๋ง์์ ๊น๋ค๋ก์ ๋ ๋ฌธ์ ๋ค.
- ์ด ์ฌ์ ์๊ฐ ๋ง์ ์ฅ๋ฅด ์์๋๋ก
- ์ฅ๋ฅด ๋ด์์ ์ฌ์ ์๊ฐ ๋ง์ ์์๋๋ก
- ์ฌ์ ์๊ฐ ๊ฐ๋ค๋ฉด id๊ฐ ์์ ์์๋๋ก
- 2๊ฐ๊น์ง ๋ฝ์์ id๋ฅผ ๊ธฐ๋กํด๋ผ
์๊ฒ ๋ถ๋ถ์ ๋๋ ์ ์์ฑํ๋๊น ์กฐ๊ธ ๋ ํธํ๋ ๊ฒ ๊ฐ๋ค.
HashMap์ value๋ก Collection์ ์ฌ์ฉํด๋ณด๋๊น ํ์ฉํ ์ ์๋ ๋ฐฉํฅ์ด ๋ง์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ๋ค.
# ์ถ๊ฐ ๊ณต๋ถ
์ด๋ฒ ๋ฌธ์ ํ๋ฉด์ ๊ฒ์ํ๋ ๊ฑด HashMap์์ key ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ด์๋ค.
List<Map.Entry<String, Integer>> list = new ArrayList(g.entrySet());
Collections.sort(list, (o1, o2) -> o2.getValue().compareTo(o1.getValue()));
entrySet์ ArrayList์ ๋ฃ์ ์ ์๋ค๋ ๊ฑธ ์ฒ์์์๋ค.
entrysetํ์ ์ Map.Entryํํ๋๊น ์ฃผ์ํด์ผ๋๊ณ , compareTo๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ด ๋ list๋ฅผ ๋ง๋ค์๋ค
Collections.sort(list, (o1, o2) -> o1.getValue().compareTo(o2.getValue()));
์ด๋ฌ๋ฉด ์ค๋ฆ์ฐจ์์ด๋ค.
compareTo์ ์์ ์๋๊ฑธ ๊ธฐ์ค์ผ๋ก compareTo์์ ๊ฐ์ด ํฌ๋ฉด ์ค๋ฆ์ฐจ์, ์์ผ๋ฉด ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๋ค. Comparator๋ฅผ ๋๋ค๋ก ์์ฑํ ํํ๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์!
'OJ๐ผ > Programmers ๊ณ ๋์ ํท' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[LV.2][JAVA] ๊ฐ์ฅ ํฐ ์ (0) | 2024.08.30 |
---|---|
[LV.2][JAVA] ์ฌ๋ฐ๋ฅธ ๊ดํธ (0) | 2024.08.28 |
[LV.2][JAVA] ๋ ๋งต๊ฒ (0) | 2024.08.27 |
[LV.2][JAVA] ์ ํ๋ฒํธ ๋ชฉ๋ก (0) | 2024.08.25 |
[LV.1][JAVA] ์์ฃผํ์ง ๋ชปํ ์ ์(feat. TreeMap) (0) | 2024.08.25 |