728x90
문제 출처
https://programmers.co.kr/learn/courses/30/lessons/42579
1. 풀이 접근
ㆍ 해시사용해서 재생횟수 확인
ㆍ Comparator<> 사용하여 클래스의 순서를 정렬함
2. 소스코드
import java.util.*;
class Music{
String g;
int p;
int o;
}
class prior{
String n;
int p;
}
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
HashMap<String, Integer> list = new HashMap<>();
HashMap<String, Integer> genreMap = new HashMap<>();
ArrayList<String> uniqGenre = new ArrayList<>();
ArrayList<Music> music = new ArrayList<>();
for(int i = 0 ; i < genres.length ; i++){
// Music m = new Music();
// m.g = genres[i];
// m.p = plays[i];
// m.o = i;
// music.add(m);
Integer a = list.getOrDefault(genres[i], 0);
list.put(genres[i], a + plays[i]);
Integer b = genreMap.getOrDefault(genres[i], 0);
if(b == 0){
genreMap.put(genres[i], 1);
uniqGenre.add(genres[i]);
}else{
genreMap.put(genres[i], b+1);
}
}
ArrayList<prior> Prior = new ArrayList<prior>();
// for(int i = 0 ; i < genres.length ; i++){
// Integer a = list.getOrDefault(genres[i], 0);
// //System.out.println(genres[i] + " " + a);
// }
for(int i = 0 ; i < uniqGenre.size() ; i++){
// System.out.println(uniqGenre.get(i));
prior p = new prior();
p.n = uniqGenre.get(i);
Integer a = list.getOrDefault(p.n, 0);
p.p = list.getOrDefault(p.n, 0);
Prior.add(p);
}
Comparator<prior> myComparator2 = new Comparator<prior>() {
@Override
public int compare(prior p1, prior p2) {
if (p1.p > p2.p) {
return -1;
}
else if (p1.p == p2.p) {
return 1;
}
return 1;
}
};
Collections.sort(Prior, myComparator2);
for(int i = 0 ; i < Prior.size() ; i++){
// System.out.println(Prior.get(i).n + " " + Prior.get(i).p);
}
int cnt = 0;
for(int i = 0 ; i < Prior.size() ; i++){
String p = Prior.get(i).n;
Integer cn = genreMap.getOrDefault(p, 0);
if(cn >= 2)
cnt += 2;
else
cnt +=1;
}
int[] playlist = new int[cnt];
int playlistIdx = 0;
for(int i = 0 ; i < Prior.size() ; i++){
String p = Prior.get(i).n;
Integer cn = genreMap.getOrDefault(p, 0);
int tem = 0;
if(cn >= 2)
tem = 2;
else
tem = 1;
for(int k = 0 ; k <tem ; k++){
int maxPlay = -1;
int minOrder= Integer.MAX_VALUE;
for(int j = 0 ; j < plays.length ; j++){
String cp = genres[j];
int corder = j;
int cpl = plays[j];
if(cpl > maxPlay && cp.equals(p))
{
minOrder = corder;
maxPlay = cpl;
}else if(cpl == maxPlay){
if(corder < minOrder){
minOrder = corder;
maxPlay= cpl;
}
}
}
// System.out.println(playlistIdx + " " +minOrder);
playlist[playlistIdx] = minOrder;
playlistIdx++;
genres[minOrder] = " ";
plays[minOrder] = 0;
maxPlay = -1;
minOrder= Integer.MAX_VALUE;
}
}
return playlist;
}
}
3. 맺음말
ㆍ 체감난이도 : 보통
ㆍ 접근 방법에 대해 특별한 알고리즘이 필요하지 않아 어렵지 않지만, 문제의 순서와 로봇의 로직을 정확하게 판단하고 그것을 구현하여야 함.
ㆍ 더욱 좋은 풀이방법이나 보완할 수 있는 부분, 또는 문제가 될 수 있는 부분들은 알려주시면 감사하겠습니다.
728x90
'IT > 알고리즘 풀이' 카테고리의 다른 글
[SWEA] [자바] 1953. 탈주범 검거 (0) | 2021.04.06 |
---|---|
[SWEA] [자바] 1949. 등산로 조성 (0) | 2021.04.04 |
[SWEA] [자바] 5656. 벽돌 깨기 (0) | 2021.04.03 |
[백준] [자바] 3190번 : 뱀 (0) | 2021.04.01 |
[백준] [자바] 17144번 : 미세먼지 안녕! (0) | 2021.03.29 |
댓글