반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 가장 큰 수
- 완주하지 못한 선수
- 다리를 지나는 트럭
- 전화번호 목록
- 코딩 테스트
- @Getter
- 검색 기능 확장
- Java
- 해시
- 스택/큐
- 롬복 어노테이션
- 기능개발
- 프로그래머스
- 크론 표현식
- 루씬 인 액션
- 정렬
- 스프링 스케쥴러
- @Setter
- 알고리즘
- kubenetes
- K번째수
- @configuration
- 고차원 함수
- 모던 자바 인 액션
- @Data
- H-index
- 쿠버네티스
- 커링
- @EnableScheduling
- 영속 자료구조
Archives
- Today
- Total
Today I Learned
[프로그래머스] 해시 Level 3. 베스트앨범(JAVA) 본문
728x90
*풀이
1. 장르별 총 재생횟수를 넣는다.(Map)
2. 장르별 음악목록(재생횟수, 고유번호)을 넣는다.(Map)
3. 장르별 총 재생횟수를 정렬한다.
4. 해당하는 음악목록을 뽑는다.(ArrayList)
5. 음악목록을 재생횟수 순으로 정렬한다.
6. 베스트앨범에 순서대로 넣는다.
좀 더 간결하게 풀 수 있는 방법은 없을까?
코드
import java.util.*;
import java.util.Collections;
class Solution {
public int[] solution(String[] genres, int[] plays) {
int[] answer = {};
ArrayList<Integer> bestMusic = new ArrayList<Integer>();
Map<String, Integer> genresCnt = new HashMap<String, Integer>();
Map<String, ArrayList> genresMusicList = new HashMap<String, ArrayList>();
for(int i = 0; i < genres.length; i++){
//장르별 재생횟수
genresCnt.put(genres[i], genresCnt.getOrDefault(genres[i], 0) + plays[i]);
//장르별 음악목록(횟수, 고유번호)
ArrayList<Music> musicList = genresMusicList.get(genres[i]);
if(musicList == null){
musicList = new ArrayList<Music>();
}
musicList.add(new Music(plays[i], i));
genresMusicList.put(genres[i], musicList);
}
//장르별 재생횟수 정렬
List<Map.Entry<String, Integer>> genresSort = new LinkedList<>(genresCnt.entrySet());
Collections.sort(genresSort, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue().compareTo(o1.getValue());
}
});
//장르별 베스트음악 추출
for(Map.Entry<String, Integer> entry : genresSort) {
ArrayList<Music> musicList = genresMusicList.get(entry.getKey());
Collections.sort(musicList);
bestMusic.add(musicList.get(0).playNo);
if(musicList.size() > 1){
bestMusic.add(musicList.get(1).playNo);
}
}
answer = new int[bestMusic.size()];
for(int i=0; i<bestMusic.size(); i++) {
answer[i] = bestMusic.get(i);
}
return answer;
}
}
//Comparable 인터페이스를 구현하고 compareTo 메소드를 override하면 sort할 수 있다.
class Music implements Comparable<Music> {
Integer playCnt;
Integer playNo;
public Music(int playCnt, int playNo) {
this.playCnt = playCnt;
this.playNo = playNo;
}
@Override
public int compareTo(Music music) {
return music.playCnt.compareTo(this.playCnt);
}
}
결과
728x90
'알고리즘 & 코딩테스트' 카테고리의 다른 글
[프로그래머스] 정렬 Level 2. 가장 큰 수(JAVA) (0) | 2021.01.24 |
---|---|
[프로그래머스] 정렬 Level 1. K번째수(JAVA) (0) | 2021.01.22 |
[프로그래머스] 해시 Level 2. 위장 (JAVA) (0) | 2021.01.20 |
[프로그래머스] 해시 Level 2. 전화번호 목록 (JAVA) (0) | 2021.01.19 |
[프로그래머스] 해시 Level 1. 완주하지 못한 선수 (JAVA) (0) | 2021.01.18 |
Comments