알고리즘 풀이/프로그래머스

★ [프로그래머스][JAVA] 베스트앨범 (해시맵, Comparator) #2

배게 2021. 10. 8. 18:11
728x90

#2 Line:18 & Line:35

Collections.sort( [list] , [Comparator] ) -> list.sort( [Comparator] );

이렇게 바꾸니까 더 깔끔한 것 같음

 

핵심은 Map에서는 value값을 이용한 정렬이 불가능하다는 점

key값으로 정렬하고자 하면 treemap으로 바꾸면됨

그 다음에는 문제가 요구하는 조건들

뭔가 이것 저것 조건들이 있어서 처음 보면 어려워보이는데

뜯어 보면 쉬운 문제들이 자잘자잘하게 붙어 있음

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
 
class Solution {
    private class Genre{
        String genre;
        int ptTotal;
        List<int[]> top2; // int[0]:인덱스, int[1]:재생시간 (곡 정보)
        
        Genre(String genre){
            this.genre = genre;
            this.ptTotal = 0;
            top2 = new LinkedList<>();
        }
        
        void addSong(int idx, int pt){
            ptTotal += pt;
            top2.add(new int[]{idx, pt});
            top2.sort((s1, s2)->(s2[1]-s1[1]));
            if(top2.size()>=3)
                top2.remove(2);
        }
        
    }
    
    public int[] solution(String[] genres, int[] pts) {
        Map<String, Genre> gm = new HashMap<>();
        for(int i=0; i<genres.length; i++){
            String g = genres[i];
            Genre curr = gm.getOrDefault(g, new Genre(g));
            curr.addSong(i, pts[i]);
            gm.put(g, curr);
        }
        
        List<Genre> gList = new ArrayList<>(gm.values());
        gList.sort((g1, g2)->(g2.ptTotal-g1.ptTotal));
        List<Integer> answerList = new ArrayList<>();
        for(Genre genre : gList){  
            for(int[] songArr : genre.top2){
                answerList.add(songArr[0]);
            }
        }
        
        int[] answer = new int[answerList.size()];
        for(int i=0; i<answerList.size(); i++)
            answer[i] = answerList.get(i);
            
        
        return answer;
    }
}
cs

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import java.util.*;
 
class Solution {
    private class Genre{
        String genre;
        int ptTotal;
        List<int[]> top2; // int[0]:인덱스, int[1]:재생시간 (곡 정보)
        
        Genre(String genre){
            this.genre = genre;
            this.ptTotal = 0;
            top2 = new LinkedList<>();
        }
        
        void addSong(int idx, int pt){
            ptTotal += pt;
            top2.add(new int[]{idx, pt});
            Collections.sort(top2, (s1, s2)->(s2[1]-s1[1]));
            if(top2.size()>=3)
                top2.remove(2);
        }
        
    }
    
    public int[] solution(String[] genres, int[] pts) {
        Map<String, Genre> gm = new HashMap<>();
        for(int i=0; i<genres.length; i++){
            String g = genres[i];
            Genre curr = gm.getOrDefault(g, new Genre(g));
            curr.addSong(i, pts[i]);
            gm.put(g, curr);
        }
        
        List<Genre> gList = new ArrayList<>(gm.values());
        Collections.sort(gList, (g1, g2)->(g2.ptTotal-g1.ptTotal));
        List<Integer> answerList = new ArrayList<>();
        for(Genre genre : gList){  
            for(int[] songArr : genre.top2){
                answerList.add(songArr[0]);
            }
        }
        
        int[] answer = new int[answerList.size()];
        for(int i=0; i<answerList.size(); i++)
            answer[i] = answerList.get(i);
            
        
        return answer;
    }
}
cs

 

 

 

뭔가.. 좀 헷갈렸음 다시 풀어야겠음

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.*;
 
class Solution {
    public class Genre{
        String genre;
        public int playTotal;
        List<int[]> top2;
        
        
        public Genre(String genre){
            this.genre = genre;
            playTotal = 0;
            top2 = new LinkedList<>();
        }
        
        public void addSong(int idx, int playTime){
            playTotal+=playTime;
            top2.add(new int[]{idx, playTime});
            Collections.sort(top2, (a,b)->b[1]-a[1]);
        }
        
        public int Compare(Genre g1, Genre g2){
            return -(g1.playTotal-g2.playTotal);
        }
        
    }
    
    public int[] solution(String[] genres, int[] plays) {
        Map<String, Genre> gm = new TreeMap<>();
        for(int i=0; i<genres.length; i++){
            String genre = genres[i];
            Genre currGenre = gm.getOrDefault(genre, new Genre(genre));
            currGenre.addSong(i, plays[i]);
            gm.put(genre, currGenre);
        }
        
        List<Integer> res = new ArrayList<>();
        List<Genre> list = new ArrayList<>(gm.values());
        list.sort((g1,g2)->g2.playTotal-g1.playTotal);
        for(Genre g : list){
            List<int[]> top2 = g.top2;
            int max=2;
            for(int[] arr : top2){
                res.add(arr[0]);
                if(--max<=0break;
            }
        }
        
        
        int[] answer = new int[res.size()];
        for(int i=0; i<res.size(); i++)
            answer[i] = res.get(i);
        return answer;
    }
}
cs