-
[프로그래머스]베스트앨범 - JAVA문제풀이/프로그래머스 2021. 3. 3. 13:36
문제
programmers.co.kr/learn/courses/30/lessons/42579
코딩테스트 연습 - 베스트앨범
스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가
programmers.co.kr
풀이
HashMap을 사용하는 문제로 HashMap에 관련된 다양한 연산들을 연습해 볼 수 있는 구현, 시뮬레이션 문제였다.
문제는 다음과 같은 과정으로 풀어 나갔다.
- hashmap에 장르별 play횟수를 중첩해서 더해준다.
- hashmap의 key값만을 추출하여 리스트를 만들고, 리스트를 play횟수를 기준으로 정렬한다. (hashmap은 순서가 없기 때문에 정렬할 수 없으므로 리스트를 만들어 정렬해 주어야 한다.)
- key값을 정렬한 리스트에서 제일 많은 횟수를 재생한 장르부터 장르별 제일 많은 횟수가 플레이된 인덱스, 두번째로 많은 횟수가 플레이된 인덱스를 찾아 정답 배열에 순서대로 넣어준다.
- 이때 두번째로 많은 횟수가 플레이된 인덱스는 존재하지 않을 수도 있기 때문에 이를 잘 처리해준다.
- 정답 리스트를 배열로 변환하여 반환한다.
이 문제에서 사용한 hashmap 메소드는 다음과 같다.
- map.getOrDefault(genres[i], 0) + plays[i];
- map.keySet();
첫 번째 함수는 map에 genres[i]값이 있다면 그 값에 + plays[i]를 하고 없다면, 그 값을 0 이라고 생각하고 + plays[i]를 하라는 함수이다.
두 번째 함수는 map에서 key만을 추출하는 함수이다. iterator메소드를 사용하여 가져온다.
코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051import java.util.*;class Solution {public int[] solution(String[] genres, int[] plays) {Map<String, Integer> map = new HashMap<>();for(int i = 0; i < genres.length; i++) {map.put(genres[i], map.getOrDefault(genres[i], 0) + plays[i]);}//key값만 가져와서 genre에 넣어준다ArrayList<String> genre = new ArrayList<>();for(String key : map.keySet()) {genre.add(key);}Collections.sort(genre, (o1, o2) -> map.get(o2) - map.get(o1)); //key값에 해당하는 value를 내림차순으로 정렬한다.ArrayList<Integer> list = new ArrayList<>();for(int i = 0; i < genre.size(); i++) {String g = genre.get(i);//해당 장르의 음악 중에서 play횟수가 가장 큰 인덱스를 찾는다int max = 0;int firstIdx = -1;for(int j = 0; j < genres.length; j++) {if(g.equals(genres[j]) && max < plays[j]) {max = plays[j];firstIdx = j;}}//해당 장르의 음악 중에서 play횟수가 두번째로 큰 인덱스를 찾는다.max = 0;int secondIdx = -1;for(int j = 0; j < genres.length; j++) {if(g.equals(genres[j]) && max < plays[j] && j != firstIdx) {max = plays[j];secondIdx = j;}}list.add(firstIdx);if(secondIdx >= 0) list.add(secondIdx); //secondIdx는 존재 할수도, 안할수도 있다.}int[] result = new int[list.size()];for(int i = 0; i < list.size(); i++) {result[i] = list.get(i);}return result;}}cs '문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스]입국심사 - JAVA (0) 2021.03.05 [프로그래머스]야근 지수 - JAVA (0) 2021.03.04 [프로그래머스]여행경로 - JAVA (0) 2021.03.02 [프로그래머스]기둥과 보 설치 - JAVA (2) 2021.03.01 [프로그래머스]단어 변환 - JAVA (0) 2021.02.28