ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스]베스트앨범 - JAVA
    문제풀이/프로그래머스 2021. 3. 3. 13:36

    문제

    programmers.co.kr/learn/courses/30/lessons/42579

     

    코딩테스트 연습 - 베스트앨범

    스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가

    programmers.co.kr

    풀이

    HashMap을 사용하는 문제로 HashMap에 관련된 다양한 연산들을 연습해 볼 수 있는 구현, 시뮬레이션 문제였다.

     

    문제는 다음과 같은 과정으로 풀어 나갔다.

    1. hashmap에 장르별 play횟수를 중첩해서 더해준다.
    2. hashmap의 key값만을 추출하여 리스트를 만들고, 리스트를 play횟수를 기준으로 정렬한다. (hashmap은 순서가 없기 때문에 정렬할 수 없으므로 리스트를 만들어 정렬해 주어야 한다.)
    3. key값을 정렬한 리스트에서 제일 많은 횟수를 재생한 장르부터 장르별 제일 많은 횟수가 플레이된 인덱스, 두번째로 많은 횟수가 플레이된 인덱스를 찾아 정답 배열에 순서대로 넣어준다.
    4. 이때 두번째로 많은 횟수가 플레이된 인덱스는 존재하지 않을 수도 있기 때문에 이를 잘 처리해준다.
    5. 정답 리스트를 배열로 변환하여 반환한다.

     

    이 문제에서 사용한 hashmap 메소드는 다음과 같다.

    1. map.getOrDefault(genres[i], 0) + plays[i];
    2. map.keySet();

    첫 번째 함수는 map에 genres[i]값이 있다면 그 값에 + plays[i]를 하고 없다면, 그 값을 0 이라고 생각하고 + plays[i]를 하라는 함수이다.

    두 번째 함수는 map에서 key만을 추출하는 함수이다. iterator메소드를 사용하여 가져온다.

     

    코드

    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
    import 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

    댓글

Designed by Tistory.